1 분 소요

어떤 오브젝트에 다른 오브젝트를 has-a 관계로 추가하는 것을 컴포지션이라고 함

구조(예시)

Image

상속 관계에서 Card(출입증) 클래스를 Person에게 has-a 방식으로 추가           

사용법

Image

  1. CDO에서 시작하자마자 필수적으로 포함하려면 CreateDefaultSubobject 함수를 이용
  2. Runtime에서 선택적으로 포함시키려면 NewObject()로 추가    

코드

1. 선언부

UPROPERTY()
TObjectPtr<class UCard> Card;   //전방선언 + Unreal5 스타일
class UCard* Card;              //Unreal4 스타일

   

2. CDO에서 추가

Card = CreateDefaultSubobject<UCard>(TEXT("NAME_Card"));

텍스트의 경우 FName 형식으로 추가되기 때문에 “NAME_“을 추가    

3. Runtime에 추가

CourseInfo = NewObject<UCourseInfo>(this);   //맴버변수로 추가
UStudent* Student1 = NewObject<UStudent>();  //지역변수로 추가

       

언리얼 UEnum 사용방법

1. 선언

UENUM()    //UClass 처럼 리플렉션을 추가
//c++ 11부터 생긴 enum class문법
enum class ECardType : uint8  //해당 Enum Type을 uint8(byte)으로 지정
{
	Student = 1 UMETA(DisplayName = "For Student"),//Enum값에 메타정보를 지정할 수 있다
	Teacher UMETA(DisplayName = "For Teacher"),
	Staff UMETA(DisplayName = "For Staff"),
	Invalid
};

   

2. 사용

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);
}

2-1) FindObject : 해당 함수로 Enum 타입 찾음
2-2) “/Script/UnrealComposition.ECardType”
> Script : c++에 생성된 객체들은 script라는 절대주소를 가짐
> UnrealComposition : 프로젝트 이름
> ECardType : 타입이름
2-3) CardEnumType->GetDisplayNameTextByValue((int64)CardType).ToString()
> 선언부에서 지정한 UMETA 이름을 가져옴
   

결과창

학생님이 소유한 카드 종류 For Student

댓글남기기