언리얼 엔진에서 지원하는 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>는 블루프린트에서 다음과 같이 테스트할 수 있다


Posted by cwisky