게임 엔진/Unreal

[Unreal] 언리얼 컴포지션과 UENUM

겜도리도리 2024. 1. 12. 15:07
반응형

앞서

이 포스팅은 이득우의 언리얼 프로그래밍 Part1을 수강하고 작성한 내용입니다.

 

개요

Is - a 관계인 상속관계만으로 설계나 유지보수하기는 어렵다.

Has - a 관계인 컴포지션을 활용해 성질이 다른 두 객체에서 한 객체가 다른 객체를 소유하는 설계를 구현할 수 있다.

 

컴포지션 관계를 언리얼에서 구현하는 방법은 크게 2가지이다.

1. CDO에 미리 언리얼 오브젝트를 생성해 조합한다. (무조건 포함할 때) : CreateDefaultSubobject() 사용

2. CDO에 빈 포인터만 넣고 런타임에 언리얼 오브젝트를 생성해 조합한다. (선택적으로 포함할 때) : NewObject 사용

이번 강의에서는 1.을 사용해 컴포지션을 구현한다.

 

내가 소유한 오브젝트를 SubObject라고 하고, 나를 소유한 오브젝트를 Outer라고 한다.

 

컴포지션

컴포지션 관계를 구현할 때는 전방선언을 사용해주는 것이 좋다.

 

위와 같은 방식은 언리얼 엔진4까지의 전방 선언 방식이다. 전방선언을 사용하면 의존성을 낮출 수 있다.

 

언리얼 엔진 5부터는 전방 선언시에 TObjectPtr을 사용한다.

 

 

이런 오브젝트를 생성할 때에는 CreateDefaultSubobject API를 사용한다. 첫 번째 인자에는 식별자 역할을 하는 FName 넣어준다.

 

 

UENUM

 

열거형의 경우에는 접두어 E를 붙여주는 것이 좋다.

또한 UENUM() 매크로를 사용할 경우 언리얼 엔진에서 객체에 대한 정보를 파악할 수 있고,

필드마다 메타 정보를 넣어줄 수 있다. 이 메타 정보는 코드에서 사용할 수 있다.

 

 

Person에 Card를 소유 시키고, Person을 순회하면서 CardType을 Log로 출력하는 코드이다.

 

 

Enum이 Log에 잘 표시되는 것을 확인할 수 있다.

 

이번에는 메타 정보를 사용해 DisplayName을 출력하는 코드이다.

언리얼 객체들은 Script라고 하는 절대 주소를 가진다. 이와 모듈이름을 이용하면 열거형에 대한 정보를 가져올 수 있다.

GetDisplayNameTextByValue에 CardType을 int64로 넘겨주면 앞서 선언했던 DisplayName 정보를 가져올 수 있다.

 

Enum의 DisplayName을 잘 표시되는 것을 확인할 수 있다.

반응형

'게임 엔진 > Unreal' 카테고리의 다른 글

[Unreal] 메모리 관리  (0) 2024.01.19
[Unreal] 델리게이트  (0) 2024.01.15
[Unreal] 인터페이스  (0) 2023.12.27
[Unreal] 언리얼 리플렉션  (0) 2023.12.24
[Unreal] 언리얼 오브젝트  (0) 2023.12.22