언리얼 오브젝트 리플렉션 시스템을 활용해서 어떤 작업을 할 수 있는지 실습 예제를 통해 확인해봤습니다.

 

[ 예제를 위한 클래스 생성 1 ]

 

- 어떤 학교에서 학생과 교수가 함께 수업하는 상황의 구현

- 학교 정보는 GameInstance에서 지정 

- 인물 클래스 ( Person )

     - 학생 클래스 ( Student )

     - 선생 클래스 ( Teacher )

 

에 이어서 예제를 이어가겠습니다.

 

[ 예제를 위한 클래스 생성 2 ]

- 클래스에 설정할 프로퍼티 정보

- Person에는 DoLesson이라는 가상 함수가 있습니다.

     - Student의 DoLesson은 수업을 듣는 행동입니다.

     - Teacher의 DoLesson은 수업을 가르치는 행동입니다.

 

Person : Name(이름), Year(학번)

Student : Id(학번) 

Teacher : Id(사번)

Student 와 Teacher은 Person을 상속받습니다.

 

베이스 클래스에서 가상 함수와 기본값, Get,Set 함수를 생성합니다.
Person 클래스를 상속받은 Student 클래스 생성

Person 클래스를 상속받기 위해 헤더에서 Person 헤더를 include 해야하는데 반드시 generated.h 가 제일 아래에 위치하도록 주의해야 합니다.

 

Person을 상속받은 Teacher 클래스 생성

이후에 MyGameInstance.cpp에서 본문을 작성할 때 Student와 Teacher 가 가진 정보들을 변경해보고 DoLesson 함수를 실행해보겠습니다.

cpp에서 헤더를 참조할 때 반드시 해당 헤더가 제일 윗줄로 위치하도록 합니다.

 

 

Student의 이름은 Get 함수를 사용해 가져왔지만, Teacher 의 이름은 리플렉션 시스템을 사용해 가져왔습니다.

Property 정보에서 FName(Key)값을 통해 데이터가 있는지 찾습니다. 기존에 선언해둔 FString Name 을 UPROPERTY() 매크로를 통해 언리얼 엔진에서 관리할 수 있도록 했기 때문에 찾을 수 있습니다.

그 후 반환된 포인터가 nullptr 이 아닐 경우 Getvalue_InContainer 함수로 해당하는 객체와 담을 변수를 인자로 전달합니다. 

 

언리얼 엔진 에디터 출력 결과
가상 함수를 실행
언리얼 엔진 에디터 출력 결과

자식 객체인 Student 에서 override로 재정의한 DoLesson 을 실행하는 코드입니다. 

Teacher 는 리플렉션 시스템을 활용해 가상 함수를 실행해봤습니다. 

Person 에서 DoLesson 을 UFUNCTION으로 등록해놨기 때문에 GetClass()->FindFunctionByName() 함수를 이용해 이름으로 함수를 찾을 수 있습니다. 마찬가지로 못 찾는 경우를 예외처리해야하므로 분기를 나눠 코드를 작성합니다. 

ProcessEvent 를 이용해 함수포인터와 인자를 전달해 함수를 실행할 수 있습니다.

C++ 에 대한 지식이 있어서인지 언리얼 C++ 이 어렵게 느껴지지 않습니다. 

 

DX 기반의 게임 프로젝트를 만들었을 땐 프로토타입 패턴, 컴포넌트 패턴을 사용해 구현해서 map 컨테이너에 보관한 원본 컴포넌트들을 Key값으로 탐색 후 복사하는 방식으로 구현했었습니다. 

언리얼 엔진의 FName 이 해시테이블로 구현되었고, 이를 활용한 수많은 기능들이 포함된 리플렉션 시스템이 상당히 편리하다고 느껴졌습니다. 하지만 리플렉션 시스템을 사용하려면 일관된 규칙을 먼저 정립하는 것이 우선된다고 생각합니다.

 

언리얼 리플렉션 시스템을 직접 활용 후 정리 

1. 리플렉션 시스템을 사용해 언리얼 오브젝트의 특정 속성과 함수를 이름으로 검색할 수 있습니다.

2. 리플렉션 시스템을 사용해 접근 지시자와 무관하게 값을 설정할 수 있습니다.

3. 리플렉션 시스템을 사용해 언리얼 오브젝트의 함수를 호출할 수 있습니다.

 

- 언리얼 엔진의 기본 프레임워크는 리플렉션을 활용해 구축되어 있으므로, 

언리얼 엔진을 이해하기 위해서는 리플렉션 시스템을 이해하는 것이 필요하다고 생각합니다. 

+ Recent posts