이득우C++_05_컴포지션
어떤 오브젝트에 다른 오브젝트를 has-a 관계로 추가하는 것을 컴포지션이라고 함
구조(예시)
상속 관계에서 Card(출입증) 클래스를 Person에게 has-a 방식으로 추가
사용법
- CDO에서 시작하자마자 필수적으로 포함하려면 CreateDefaultSubobject 함수를 이용
- 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
댓글남기기