3. RTTI (Run Time Type Information )
• 런타임 중 타입에 대한 정보를 제공해주는 기능
실행시간에 타입에 대한 메타데이터를 생성하여 안전한 다운 캐스팅(dynamic_cast)을 지원한다.
안전하지 못한 다운 캐스팅 예시
4. RTTI와 메타 데이터
• 메타데이터
어떤 목적을 위해 만들어진 데이터를 위한 데이터
RTTI 사용 시, 이러한 메타데이터를 생성하고
해당 데이터를 참조해 원하는 정보를 찾아야함으로
속도가 느리고 메모리 사용량이 증가한다
이미지 파일 하나에도 많은 메타데이터가 있다
5. 쓰면 손해인 기능을 왜 만들어놨지?
위의 먹이 문제도 다형성을 활용하면 해결 가능한데?
6. 이처럼 필연적으로 다형성을 활용하기에 애매한 상황이 온다
혹은 코드 자체가 이미 다형성을 활용해 해결할 수 없는 구조가 되어있을 수 있음
8. 이러한 방식을 원시RTTI(primitive RTTI)또는 수동RTTI(manual RTTI) 라고 부르고
해당 방식 외에도 Custom RTTI를 구현해 사용하는 식으로 해결합니다.
이러한 방식 역시 타입 체크를 위한 메타데이터를 만들어 사용하게 되므로
가장 원시적인 RTTI라고 볼 수 있으며.
언리얼 역시 이러한 이유로 언리얼만의 메타데이터를 생성한다.
메타데이터를 만듬으로서 이것저것 유용한 기능들을 구현할 수 있다!
현재 프로젝트에선 아래와 같은 방식을 사용했습니다.
11. 리플렉션
프로그램이 자기 자신을 거울에 비친 것처럼 보고,
거울을 통해 자신의 구조와 성질을 알아내 조작할 수 있는 기능
C#, Java, Python, 등등 다른 언어의 경우,
언어차원에서 리플렉션을 지원하지만
C++은 지원하지 않으므로 직접 구현을 해야한다.
언리얼 역시 자체적으로 구현된 리플렉션을 제공한다.
Parse
12. 언리얼 리플렉션
언리얼에서 새로운 클래스를 만들 땐,
비쥬얼 스튜디오에서 생성하는게 아닌, 언리얼 엔진상에서 생성하도록 권장한다.
13. 언리얼 리플렉션
이렇게 생성된 헤더파일에는
언리얼에서 헤더파일을 파싱하기 위한
추가적인 코드들이 삽입되어있다.
프로젝트의 Intermediate 폴더를 보면 헤더파일을 파싱하여,
리플렉션을 위한 코드 파일이 새로 생성되있다.
14. UHT (Unreal Header Tool)
• 이렇게 사전 작업으로 헤더를 파싱하여, 메타데이터를 생성하는 역할을 담당
1. 빌드 시작 시, 모든 C++ 소스 코드를 스캔하여
UCLASS() , UFUNCTION(), UPROPERTY() 같은
마크업 키워드들을 찾는다.
2. 해당 파일을 파싱하여, 메타데이터를 추출한다.
3. 추출된 메타 데이터로 generated.h와 같은 추가적인 코드
파일을 생성한다.
15. 생성된 파일을 보게되면, 해당 클래스를 언리얼 오브젝트로 등록하고
변수나 함수들을 저장해놓는 코드가 생성되어있음을 볼 수 있다
이렇게 생성된 코드를 토대로 언리얼 시스템에 의해 관리될 수 있는
UObject 객체로 동작하게 된다.
23. 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