간만!
Using Structs
Get started using Structs with this short guide
docs.unrealengine.com
5.1 버전에서는 Using Structs 문서가 없다...(왜지?)
구조체 구성
- 구조체를 정의하려는 헤더(.h) 파일을 엽니다 .
- C++ 구조체를 정의 하고 USTRUCT그 앞에 구조체에 필요한 UStruct 지정자를 포함하여 매크로 를 추가하세요 .
- GENERATED_BODY구조체 상단에 매크로를 추가하세요 .
- 이제 구조체의 멤버 변수에 태그를 지정하여 UPROPERTYUE의 리플렉션 시스템과 블루프린트 스크립팅에 표시되도록 할 수 있습니다.
- 이 UProperty 지정자 목록을 확인하여 엔진과 에디터의 다양한 측면에서 해당 속성이 어떻게 작동하는지 확인하세요.
이 순서대로 만들면 된다.
추가 정보
다음은 Structs를 사용할 때 기억해야 할 몇 가지 유용한 힌트와 사항입니다.
- UStructsUE의 스마트 포인터 및 가비지 수집 시스템을 사용하여 UObjects가비지 수집으로 인해 제거되는 것을 방지할 수 있습니다.
- 구조체는 단순한 데이터 타입에 적합하므로 UOject와 다릅니다..
- 프로젝트 내부에서 다 복잡한 인터렉션을 하기 위해서는, 대신 UObject 또는 AActor 서브클래스를 만드는 것이 좋습니다.
- UStructs 복제 대상으로 간주 되지 않습니다..
- UProperty변수는 복제를 위해 간주 됩니다.
- UE에는 구조체에 대한 Make 및 Break 기능을 자동으로 생성하는 기능이 있습니다.
- BlueprintType 태그로 아무 UStruct를 표시합니다.
- UStruct에 하나 이상의 속성이 BlueprintReadOnly 또는 BlueprintReadWrite 프로퍼티가 있다면 Break가 표시됩니다.
- Break가 생성하는 순수 노드는 BlueprintReadOnly또는 BluerpintReadWrite로 태그된 각 프로퍼티에 출력 핀을 하나씩 제공합니다.
언리얼 구조체 UStruct
- 데이터 저장/전송에 특화된 가벼운 객체
- 대부분 GENERATED_BODY 매크로를 선언해준다.
- 리플렉션, 직렬화 같은 유용한 기능을 지원함.
- GENERATED_BODY를 선언한 구조체는 UScriptSturct클래스로 구현됨.
- 이 경우 제한적으로 리플렉션을 지원함
- 속성 UPROPERTY만 선언할 수 있고 함수 UFUNCTION은 선언할 수 없음.
- 언리얼 엔진의 구조체 이름은 F로 시작함.
- 대부분 힙 메모리 할당(포인터 연산) 없이 스택 내 데이터로 사용됨.(C#과 동일)
- NewObjectAPI를 사용할 수 없음.
언리얼 리플렉션 관련 계층구조
실습
USTRUCT()
struct FStudentData
{
GENERATED_BODY()
FStudentData()
{
Name = TEXT("홍길동");
Order = -1;
}
FStudentData(FString InName, int32 InOrder) : Name(InName), Order(InOrder) { }
friend FORCEINLINE uint32 GetTypeHash(const FStudentData& InStudentData)
{
return GetTypeHash(InStudentData.Order);
}
UPROPERTY()
FString Name;
UPROPERTY()
int32 Order;
};
기본적으로만 추가 해준다.
여기서 이름을 랜덤으로 생성해주는 기능을 만들어 보자
FString MakeRandomName()
{
TCHAR FirstChar[] = TEXT("김이박최");
TCHAR MiddleChar[] = TEXT("상혜지성");
TCHAR LastChar[] = TEXT("수은원연");
TArray<TCHAR> RandArray;
RandArray.SetNum(3);
RandArray[0] = FirstChar[FMath::RandRange(0, 3)];
RandArray[1] = MiddleChar[FMath::RandRange(0, 3)];
RandArray[2] = LastChar[FMath::RandRange(0, 3)];
return RandArray.GetData();
}
MyInstance.cpp에 이 함수를 추가하고,
Init()에는
const int32 StudentNum = 300;
for (int32 ix = 0; ix < StudentNum; ++ix)
{
StudentsData.Emplace(FStudentData(MakeRandomName(), ix));
}
이 기능을 추가하자.
그리고
TArray<FString> AllStudentsNames;
Algo::Transform(StudentsData, AllStudentsNames,
[](const FStudentData& Val)
{
return Val.Name;
}
);
UE_LOG(LogTemp, Log, TEXT("모든 학생의 수 : %d"), AllStudentsNames.Num());
이전에 사용했던 알고리즘 라이브러리의 Transform을 사용하자.
TSet<FString> ALlUniqueNames;
Algo::Transform(StudentsData, ALlUniqueNames,
[](const FStudentData& Val)
{
return Val.Name;
}
);
UE_LOG(LogTemp, Log, TEXT("중복 없는 학생 이름의 수 : %d"), ALlUniqueNames.Num());
그 밑에는 Set을 사용해서 중복없는 이름을 확인 해보자
LogTemp: 모든 학생의 수 : 300
LogTemp: 중복 없는 학생 이름의 수 : 64
출력이 정상적으로 잘 되는걸 확인 했다.
'Unreal' 카테고리의 다른 글
7-2. 언리얼 컨테이너 라이브러리 - TSet (1) | 2023.10.16 |
---|---|
7-1. 언리얼 컨테이너 라이브러리 - TArray (1) | 2023.10.11 |
6. Delegate - 2 (0) | 2023.10.03 |
6. Delegate - 1 (0) | 2023.09.20 |
5. 컴포지션 (0) | 2023.09.11 |