이러한 방식을 원시RTTI(primitiveRTTI)또는 수동RTTI(manual RTTI) 라고 부르고
해당 방식 외에도 Custom RTTI를 구현해 사용하는 식으로 해결합니다.
이러한 방식 역시 타입 체크를 위한 메타데이터를 만들어 사용하게 되므로
가장 원시적인 RTTI라고 볼 수 있으며.
언리얼 역시 이러한 이유로 언리얼만의 메타데이터를 생성한다.
메타데이터를 만듬으로서 이것저것 유용한 기능들을 구현할 수 있다!
현재 프로젝트에선 아래와 같은 방식을 사용했습니다.
리플렉션
프로그램이 자기 자신을거울에 비친 것처럼 보고,
거울을 통해 자신의 구조와 성질을 알아내 조작할 수 있는 기능
C#, Java, Python, 등등 다른 언어의 경우,
언어차원에서 리플렉션을 지원하지만
C++은 지원하지 않으므로 직접 구현을 해야한다.
언리얼 역시 자체적으로 구현된 리플렉션을 제공한다.
Parse
언리얼 리플렉션
이렇게 생성된헤더파일에는
언리얼에서 헤더파일을 파싱하기 위한
추가적인 코드들이 삽입되어있다.
프로젝트의 Intermediate 폴더를 보면 헤더파일을 파싱하여,
리플렉션을 위한 코드 파일이 새로 생성되있다.
14.
UHT (Unreal HeaderTool)
• 이렇게 사전 작업으로 헤더를 파싱하여, 메타데이터를 생성하는 역할을 담당
1. 빌드 시작 시, 모든 C++ 소스 코드를 스캔하여
UCLASS() , UFUNCTION(), UPROPERTY() 같은
마크업 키워드들을 찾는다.
2. 해당 파일을 파싱하여, 메타데이터를 추출한다.
3. 추출된 메타 데이터로 generated.h와 같은 추가적인 코드
파일을 생성한다.
15.
생성된 파일을 보게되면,해당 클래스를 언리얼 오브젝트로 등록하고
변수나 함수들을 저장해놓는 코드가 생성되어있음을 볼 수 있다
이렇게 생성된 코드를 토대로 언리얼 시스템에 의해 관리될 수 있는
UObject 객체로 동작하게 된다.
Class Default Object(CDO)
• 클래스의 기본 속성과 동작을 정의하는 기본 인스턴스로서
해당 클래스로 생성되는 모든 인스턴스들에 적용된다.
앞서 설명한 UHT이 헤더파일을 파싱하여 생성되는 메타데이터 파일에
CDO를 생성하는 코드가 만들어진다.
24.
언리얼에서 UObject 하나가초기화 되면
UClass 인스턴스 하나와 CDO인스턴스 하나가 만들어진다
( UClass 인스턴스는 앞서 말한 메타데이터를 담고있는 인스턴스이고
CDO 인스턴스는 static character warrior;같이 전역 변수라고 보면 될 듯?)
Class Default Object (CDO)
25.
Class Default Object(CDO)
• 언리얼 오브젝트는 모듈 단위로 관리되고, 언리얼이 사용될 모듈들을 로딩하며,
로딩 시마다 CDO를 생성한다.
언리얼 엔진 실행시, 초기화 로딩 화면이 바로 CDO를 생성하는 시점이다.
26.
Class Default Object(CDO)
• 언리얼 오브젝트의 생성자는 CDO를 제작하기 위한 목적으로 사용된다.
CDO는 모듈 로딩 시점에 생성되니,
모듈이 로딩 완료된 이후의 실제 게임플레이 상에서는 생성자가 호출되지 않는다.
대신 BeginPlay() 같은 함수를 제공한다.
생성자는 CDO생성을 위해
모듈 로딩시에만 호출된다.
게임 플레이시에는 BeginPlay를 사용한다.
27.
요약
• C++에서 메타데이터를만들면 다양한 기능 제공이 가능하다.
그렇기 때문에 언리얼에서는 자체적으로 메타데이터를 구성하여
리플렉션이나 CDO 같은 유용한 기능들을 제공한다.
리플렉션은 거울에 비친 모습을 보면서 자기자신을 관리하는 기
능을 의미한다.
CDO는 비유하자면 ‘원본 레시피‘ 이고 이를 바탕으로 여러 요리
를 만들 수 있다.
28.
참조 사이트
언리얼 리플렉션공식 문서 https://www.unrealengine.com/ko/blog/unreal-property-
system-reflection
언리얼 CDO 공식 문서
https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP
/UnrealArchitecture/Objects/
이득우님 블로그
https://koreanfoodie.me/912
CDO관련 블로그
https://kyoun.tistory.com/125
+ Chat GPT