튀김족발
공부 끄적이는 공간
튀김족발
전체 방문자
오늘
어제
  • 분류 전체보기 (33)
    • C++ (10)
    • DirectX (12)
    • Unreal (11)
    • Unity (0)
    • EASTL (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
튀김족발

공부 끄적이는 공간

7-3 언리얼 컨테이너 라이브러리 - 구조체
Unreal

7-3 언리얼 컨테이너 라이브러리 - 구조체

2023. 11. 22. 20:47

간만!

 

구조체다.
https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/GameplayArchitecture/Structs/UsingStructs/

 

Using Structs

Get started using Structs with this short guide

docs.unrealengine.com

5.1 버전에서는 Using Structs 문서가 없다...(왜지?)

 

구조체 구성

  1. 구조체를 정의하려는 헤더(.h) 파일을 엽니다 .
  2. C++ 구조체를 정의 하고 USTRUCT그 앞에 구조체에 필요한 UStruct 지정자를 포함하여 매크로 를 추가하세요 .
  3. GENERATED_BODY구조체 상단에 매크로를 추가하세요 .
  4. 이제 구조체의 멤버 변수에 태그를 지정하여 UPROPERTYUE의 리플렉션 시스템과 블루프린트 스크립팅에 표시되도록 할 수 있습니다.
    1. 이 UProperty 지정자 목록을 확인하여 엔진과 에디터의 다양한 측면에서 해당 속성이 어떻게 작동하는지 확인하세요.

이 순서대로 만들면 된다.

 

추가 정보

다음은 Structs를 사용할 때 기억해야 할 몇 가지 유용한 힌트와 사항입니다.

  1. UStructsUE의 스마트 포인터 및 가비지 수집 시스템을 사용하여 UObjects가비지 수집으로 인해 제거되는 것을 방지할 수 있습니다.
  2. 구조체는 단순한 데이터 타입에 적합하므로 UOject와 다릅니다..
    1.  프로젝트 내부에서 다 복잡한 인터렉션을 하기 위해서는, 대신 UObject 또는 AActor 서브클래스를 만드는 것이 좋습니다.
  3. UStructs 복제 대상으로 간주 되지 않습니다..
    1. UProperty변수는 복제를 위해 간주 됩니다.
  4. UE에는 구조체에 대한 Make 및 Break 기능을 자동으로 생성하는 기능이 있습니다.
    1. BlueprintType 태그로 아무 UStruct를 표시합니다.
    2. UStruct에 하나 이상의 속성이 BlueprintReadOnly 또는 BlueprintReadWrite 프로퍼티가 있다면 Break가 표시됩니다.
    3. 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
    'Unreal' 카테고리의 다른 글
    • 7-2. 언리얼 컨테이너 라이브러리 - TSet
    • 7-1. 언리얼 컨테이너 라이브러리 - TArray
    • 6. Delegate - 2
    • 6. Delegate - 1
    튀김족발
    튀김족발

    티스토리툴바