언리얼 구조체 UStruct
: 관련 프로퍼티(변수)를 체계화, 조작할 수 있는 데이터 구조체
https://docs.unrealengine.com/5.3/ko/structs-in-unreal-engine/
- 데이터 저장, 전송에 특화된 가벼운! 객체
하지만 UObject와는 전혀 다르다. 따라서, 프로젝트에서 복잡한 기능은 UObject로 만드는게 맞다. - 대부분 GENERATED_BODY 매크로를 선언하게 되는데,
- 리플렉션, 직렬화 같은 유용 기능을 지원
- GENERATED_BODY를 선언한 구조체는 UScriptStruct 클래스로 구현 (UStruct라고 안부르고, UScriptStruct)
- 제한적인 리플렉션 제공 (UPROPERTY는 가능한데 UFUNCTION은 불가)
(애초에 기능 자체가 데이터 전송과 저장인데 기능 구현하는 함수는 필요가 없지.)
- 언리얼 엔진의 구조체 이름은 F로 시작해서, 언리얼엔진이 메모리 관리를 해주지 않음.(일반 객체로 본다는 뜻)
- 데이터 저장, 전송에 특화된 가벼운! 객체이다보니 메모리 할당할 이유가 없어서
멤버변수나 스택 내 데이터로 사용된다. - 그리고 NewObject API도 사용X(UObject가 아니니까)
- 데이터 저장, 전송에 특화된 가벼운! 객체이다보니 메모리 할당할 이유가 없어서
일반적으로 구조체! 라고 부르는 UScriptStruct는 UFunction을 받지 않는것을 볼 수 있다.
구조체 선언은 이렇게 한다.
- 구조체는 UObject가 아니기때문에 접두사F를 붙인다. FStudentData
- 기본적으로 구조체는 public이기 때문에 따로 적을 필요는 없다.
- 또한 UObject가 아니라서 구조체 선언에서 미리 생성자를 오버로딩(정의)할 수 있다.
- 기본적으로 구조체의 변수에는 UProperty를 안넣어도 되지만, 넣어봤다.(그냥 디폴트로 변수에는 UPROPERTY!라고 외우면 안되나..)
이건 클래스에 선언한 변수인데, 같은 TArray타입이여도 구조체를 받는지, 언리얼 오브젝트를 받는지에 따라
UPROPERTY()의 유무가 달라진다.
해당 소스파일에서만 사용할 함수이다.(그래서 UFUNCTION을 쓰지 않고, 접두사도 F이다.) 기능은 랜덤 이름을 지정한다.
- StudentData라는 TArray에 FStudent(구조체)타입의 정보를 삽입한다.
(TArray에 데이터 삽입 시 Add와 Emplace를 사용한다.. 라고 저번 글에 남겼다.) - 각각 TArray와 TSet으로 구현했는데, 결과는 이렇게 나온다.
- Algo::Transform(SourceData, Target, Lambda Function) 을 사용해서 복사할 수 있다.
TMap
key + value 구성의 튜플(Tuple)데이터의 TSet구조
STL map | 언리얼 TMap |
1. 이진트리 구성 2. 정렬 지원은 하지만, 효율 ↓ 3. 모든 자료를 순회하는데 적합X(트리를 타고 가야해서..) |
1. TSet의 데이터 구조가 튜플인 구성 2. 따라서 내부 구조는 TSet과 동일 = 해시테이블 형태로 구축 (검색빠름, 재구축X) = 동적 배열의 형태 3. TSet과 다르게 중복을 허용하고 싶으면 TMultiMap사용 (기본적으로는 중복X) |
TMap을 선언한다. 여기도 TMap의 타입이 각각 int32, FString으로 UObject가 없기때문에 UPROPERTY는 생략한다.
TMap 구현
여기서는 TMap으로 구현을 하되 순번과 이름에 따라 나눈다.
기본적으로 TMap은 중복을 허락하지 않기 때문에 결과를 보면,
이렇게 300, 64로 다른 것을 알 수 있다.
TMap 중복허용, TMultiMap
다만, 중복을 허락하고 싶으면, TMultiMap 을 사용하면 된다.
TMap에서 특정 데이터 출력, MultiFind
특정 데이터를 출력하는 방법으로는 MultiFind를 사용할 수 있다.
TSet + UStruct로 TMap 구현해보기
솔직히 이렇게 제목을 구성해도 되는지는 모르겠는데 맞는거같아서 일단 이렇게 생각하고 있다.
애초에 TMap은 TSet안에 해시테이블구조로 되어있는 형태이다.
TSet<UStruct>로 구현한다.
다만, 여기서 UStruct, 내가 만든 구조체는 해시테이블형태로 구현하지 않았기 때문에 관련 오류가 나고, 이를 해결하기 위해
구조체에 2가지 함수를 추가한다.
정리
TMap
: 중복 불허, 키 밸류 관리
TMultiMap
: 중복 허용, 키 밸류 관리
'하고싶은거 > Unreal' 카테고리의 다른 글
Part1 13. 언리얼 오브젝트 관리 : 직렬화 (0) | 2024.03.14 |
---|---|
Part1 12. 언리얼 엔진 메모리 관리 (0) | 2024.03.13 |
Part1 10. 언리얼 컨테이너 라이브러리 UCL : TArray, TSet (1) | 2024.03.11 |
Part1 09. 언리얼 C++ 설계 : 델리게이트 (0) | 2024.03.10 |
Part1 08. 언리얼 C++ 설계 : 컴포지션 (0) | 2024.03.10 |
#개발 #게임 #일상
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!