언리얼만의 C++은 컴포지션을 구현하는 독특한 패턴이 있다.
//UPROPERTY()
//class UCard* Card; // 컴포지션에서는 전방선언을 통해 헤더파일 포함하지않고 의존성을 없앨수 있음. 어짜피 컴포지션 변수는 포인터니까 이 방식은 언리얼4에서는 정석이었지만 5부터는 다른방식으로 하라고 에픽에서 제시함.
UPROPERTY()
TObjectPtr<class UCard> Card; // 위 방식대신 언리얼5에서 변경된 부분
클래스 기본 객체를 생성하는 생성자 코드를 사용해 복잡한 언리얼 오브젝트를 생성 할 수 있음.
언리얼 C++ 컴포지션 Has-A 관계 용어
언리얼 C++이 제공하는 확장 열거형을 사용해 다양한 메타 정보를 넣고 활용할 수 있다 .
UENUM()
enum class ECardType : uint8
{
Student = 1 UMETA(DisplayName = "For Student"),
Teacher UMETA(DisplayName = "For Teacher"),
Staff UMETA(DisplayName = "For Staff"),
Invalid
};
const UEnum* CardEnumType = FindObject<UEnum>(nullptr, TEXT("/Script/UnrealComposition.ECardType")); // 메타데이터를 직접조회하여 열거형에 적용된 메타 데이터를 표시할수도 있음.
if (CardEnumType)
{
FString CardMetaData = CardEnumType->GetDisplayNameTextByValue((int64)CardType).ToString();
UE_LOG(LogTemp, Log, TEXT("%s님이 소유한 카드 종류 : %s"), *Person->GetName(), *CardMetaData);
}
<aside> 💡 언리얼 C++의 컴포지션 기법은 게임내에 복잡한 객체를 설계하고 생성할 때 유용하게 사용된다.
</aside>