Unreal Engine C++ 기초집LESSON 11
Unreal 컨테이너
난이도초급
예상 시간35분
선수지식10강의 UObject 참조
11강. Unreal 컨테이너
1. 이번 강의에서 해결할 문제
적 목록, 점수표와 한 번 처리한 태그를 모두 같은 배열에 저장해 검색 코드와 중복 검사가 늘어납니다. 데이터 사용 방식에 맞춰 컨테이너를 선택합니다.
2. 학습 목표
3. 핵심 개념
TArray는 연속된 순서와 인덱스 접근에 적합합니다. TMap은 키에서 값으로 조회하고 TSet은 값 자체의 포함 여부를 빠르게 확인합니다. 컨테이너 선택은 “몇 개 저장하는가”보다 “어떻게 찾고 수정하는가”가 기준입니다.
UObject 참조를 컨테이너 멤버에 오래 보관한다면 컨테이너 필드도 UPROPERTY로 표시하고 TObjectPtr 요소를 사용합니다. Destroy가 요청된 Actor가 배열에 남을 수 있으므로 접근 시 IsValid로 거르고 이벤트에서 제거합니다.
4. 단계별 실습
파일 경로: Source/TopDownSurvival/Systems/SurvivalRegistry.h
SurvivalRegistry.h
#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "SurvivalRegistry.generated.h"
UCLASS(ClassGroup = "Survival", meta = (BlueprintSpawnableComponent))
class TOPDOWNSURVIVAL_API USurvivalRegistry : public UActorComponent
{
GENERATED_BODY()
public:
void AddEnemy(AActor* Enemy);
void RemoveEnemy(AActor* Enemy);
int32 GetScore(FName EnemyType) const;
private:
UPROPERTY()
TArray<TObjectPtr<AActor>> ActiveEnemies;
UPROPERTY(EditDefaultsOnly, Category = "Score")
TMap<FName, int32> ScoreByEnemyType;
UPROPERTY()
TSet<FName> SpawnedWaveIds;
};
파일 경로: Source/TopDownSurvival/Systems/SurvivalRegistry.cpp
SurvivalRegistry.cpp
#include "Systems/SurvivalRegistry.h"
void USurvivalRegistry::AddEnemy(AActor* Enemy)
{
if (IsValid(Enemy))
{
ActiveEnemies.AddUnique(Enemy);
}
}
void USurvivalRegistry::RemoveEnemy(AActor* Enemy)
{
ActiveEnemies.Remove(Enemy);
}
int32 USurvivalRegistry::GetScore(FName EnemyType) const
{
if (const int32* Score = ScoreByEnemyType.Find(EnemyType))
{
return *Score;
}
return 0;
}
5. 코드가 동작하는 이유
AddUnique는 배열 순서를 유지하면서 같은 포인터의 중복 삽입을 막습니다. TMap의 Find는 값 포인터를 반환하므로 키가 없을 때 null을 검사합니다. TSet은 Wave ID를 한 번 처리했는지 확인하는 데 적합하며 별도 bool 배열 검색이 필요 없습니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
MINI QUIZ
0 / 2Unreal 컨테이너 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
11강. Unreal 컨테이너 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.