언리얼 엔진에서 지원하는 C++ 컨테이너 사용 예
언리얼 엔진에서 지원하는 C++ 컨테이너에는 아래와 같은 것들이 있는데, 다른 고급언어에서 지원하는 List, Set, Map 과 같은 컬렉션 API와 유사한 특징을 갖고 있다
- TArray<T> : 원소의 중복허용, 순서유지
- TSet<T> : 원소의 중복안됨, 순서유지
- TMap<T,S> : 키, 값의 쌍으로 데이터를 저장함, 키는 중복 안됨
언리얼 엔진에서 BlueprintFunctionLibrary 하위 클래스를 작성하고 아래와 같은 내용으로 TArray<T> 를 테스트한다
TArray<FString> UMyBlueprintFunctionLibrary::ArrayTest()
{
TArray<FString> strArr;
strArr.Add(FString("Smith"));
strArr.Add(FString("Jone"));
strArr.Add(FString("Scott"));
strArr.Add(FString("Andy"));
strArr.Add(FString("Andy")); // 중복저장도 허용되고, 저장순서도 유지된다
strArr.Insert(FString("WARD"),0);
int len = strArr.Num();
//인덱스를 이용한 배열의 원소접근
for (int i = 0; i < len; i++) {
FString name = strArr[i];
}
//반복자를 이용한 배열의 원소접근
for (TArray<FString>::TIterator it = strArr.CreateIterator(); it; ++it) { //후증가는 구현안됨
FString name = *it;
}
return strArr;
}
블루프린트 그래프에서 다음과 같이 TArray<T>를 한다 (C++코드를 수정했으면 블루프린트에서도 살짝 변경하여 다시 저장해주면 제대로 반영되는 것 같다)
TSet<T> 테스트 : 저장 순서가 유지되고 중복저장은 안된다
TSet<int> UMyBlueprintFunctionLibrary::SetTest()
{
TSet<int> set;
set.Add(2);
set.Add(1);
set.Add(3);
set.Add(5);
set.Add(4);
set.Add(5); // 오류는 아니지만 중복저장은 안됨
// TSet은 인덱스를 이용하여 접근할 수는 없다(반복자만 가능)
for (TSet<int>::TIterator it = set.CreateIterator(); it; ++it) { // 후증가 기능은 정의되지 않음
int num = *it;
FString sNum = FString::FromInt(*it);
}
return set;
}
블루프린트에서 다음과 같이 TSet<T>을 테스트할 수 있다
TMap<T,S>의 테스트
TMap<FString, FString> UMyBlueprintFunctionLibrary::MapTest()
{
TMap<FString, FString> map;
map.Add(FString(TEXT("1번")), FString(TEXT("Adam")));
map.Add(FString(TEXT("2번")), FString(TEXT("Marry")));
map.Add(FString(TEXT("3번")), FString(TEXT("Jone")));
map.Add(FString(TEXT("4번")), FString(TEXT("Smith")));
map.Add(FString(TEXT("5번")), FString(TEXT("Andy")));
map.Add(FString(TEXT("5번")), FString(TEXT("Ward"))); // 중복안됨,기존 5번 항목을 덮어씀
FString name = map[FString(TEXT("2번"))];
for (TMap<FString, FString>::TIterator it = map.CreateIterator(); it; ++it) {
FString key = it->Key; // K는 대문자
FString name = it->Value; // V는 대문자
}
return map;
}
TMap<T,S>는 블루프린트에서 다음과 같이 테스트할 수 있다