언리얼 오브젝트 리플렉션 시스템을 활용해서 어떤 작업을 할 수 있는지 실습 예제를 통해 확인해봤습니다.
[ 예제를 위한 클래스 생성 1 ]
- 어떤 학교에서 학생과 교수가 함께 수업하는 상황의 구현
- 학교 정보는 GameInstance에서 지정
- 인물 클래스 ( Person )
- 학생 클래스 ( Student )
- 선생 클래스 ( Teacher )
에 이어서 예제를 이어가겠습니다.
[ 예제를 위한 클래스 생성 2 ]
- 클래스에 설정할 프로퍼티 정보
- Person에는 DoLesson이라는 가상 함수가 있습니다.
- Student의 DoLesson은 수업을 듣는 행동입니다.
- Teacher의 DoLesson은 수업을 가르치는 행동입니다.
Person : Name(이름), Year(학번)
Student : Id(학번)
Teacher : Id(사번)
Student 와 Teacher은 Person을 상속받습니다.
Person 클래스를 상속받기 위해 헤더에서 Person 헤더를 include 해야하는데 반드시 generated.h 가 제일 아래에 위치하도록 주의해야 합니다.
이후에 MyGameInstance.cpp에서 본문을 작성할 때 Student와 Teacher 가 가진 정보들을 변경해보고 DoLesson 함수를 실행해보겠습니다.
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. 리플렉션 시스템을 사용해 언리얼 오브젝트의 함수를 호출할 수 있습니다.
- 언리얼 엔진의 기본 프레임워크는 리플렉션을 활용해 구축되어 있으므로,
언리얼 엔진을 이해하기 위해서는 리플렉션 시스템을 이해하는 것이 필요하다고 생각합니다.
'Unreal Engine 5 > 언리얼 C++' 카테고리의 다른 글
언리얼 C++ 설계 3 - 델리게이트 (Delegate) (0) | 2023.07.26 |
---|---|
언리얼 C++ 설계 2 - 컴포지션 (Composition) (0) | 2023.07.26 |
언리얼 C++ 인터페이스 클래스와 C++ 인터페이스 클래스와 차이점 (0) | 2023.07.26 |
언리얼 C++ 설계 1 - 인터페이스 (Interface) (0) | 2023.07.25 |
언리얼 오브젝트 리플렉션 시스템 1 (0) | 2023.07.25 |