본문 바로가기

프로그래밍/TIL

자체 게임 엔진 개발하기 (HopStep Engine) - Reflection과 Property / 해야할 일 정리 (2)

Metadata

 언리얼에는 메타데이터라는 이름을 사용하는 여러가지 메서드들이 있다. 이는 언리얼 리플렉션 구조에서는 Field라는 클래스가 담당하고 있다. 그래서 이 녀석은 뭐지...? 하고 좀 살펴보니 UPROPERTY 한정자들을 저장해주는 것 같다. 정말 에디터에서 사용할 메타데이터라는 느낌? 당분간은 이 메타데이터에 신경쓰지 말자.

 

해야할 일 정리하기

 게임을 하다왔더니 내가 뭘 하려고 했었는지 잘 생각이 나질 않아서 뭘 할지 좀 정리하기로 했다. 나는 뭘 하고 싶은걸까?

 우선 선언되어있는 GameObject의 프로퍼티들을 알 수 있게 했으면 좋겠다. 더 구체적으로 말하면 GameObject의 Ctrl + C, V를 구현하면 어떨까?

 언리얼에서는 액터를 선택한 채로 Ctrl + C를 누르면 이 액터의 정보를 Clipboard에 직렬화한다. 거기서 레벨에 Ctrl + V를 누르면 이 정보를 가지고 새로운 액터를 만들어내게 되는데, 그렇지 않고 메모장에 붙여넣기를 하게 되면 이 직렬화된 정보들을 볼 수 있다.

UE4 JOURNEY HOW TO BRING THE LIGHTS OF OTHER PROJECTS (TEAM) _ BLACK, LOW-KEY LUXURY ㄛ 블로그 - 프로그래머 베이비 - 프로그래머 베이비 (cxybb.com)

 

 잘 보면 각 계층의 정보를 담고 있고, 이 정보는 결국 UPROPERTY로 선언된 정보들임을 알 수 있다. 이 코드가 어떻게 동작하고 있는 건지 분석을 좀 하고, 그대로 구현해보자. 아마도 프로퍼티들을 순회하면서 정보를 담고, 다시 역직렬화하는 코드가 있을 것이다. 여기서 조금 더 나아가면 FArchive와 Serialize 로직을 구현할 수 있을 것 같다는 생각이 든다.

 

HType

 나는 리플렉션에서 사용할 클래스 객체를 HType이라는 객체로 총칭하였는데, 아무래도 계속 언리얼이랑 달라져서 헷갈린다. HType은 내 쪽에서 구현할 TypeLibrary에 대한 인터페이스로만 사용하려고 하고, 나머지 계층 구조는 언리얼을 따라가는 쪽으로 바꿀 예정이다.

 

 상속 관계를 정리해보자면,

  • HField : 이름 + Metadata (추후에)
  • HType : TypeLibrary에 등록될 수 있는 인터페이스
  • HStruct : 상속성 + 프로퍼티 관리
  • HClass : CDO + Functions

 

 그러면 지금 내가 구현해놓은 HType은 HStruct의 역할을 하고 있는 계층이다. HStruct로 이름을 바꿔주고, HTypeGenerator는 삭제해주자.

 지금은 HTypeGenerator가 TypeLibrary에 StaticClass를 등록해주는 역할을 해주었는데, 이제는 그러지 말자. HStruct를 선언하고, HStruct의 프로퍼티들을 탐색해서 StaticClass를 등록할때 적절하게 넣어줄 수 있도록 해야한다.

 그렇기 위해서 HopStep Header Tool(HHT)을 만들자.

  • 빌드할 때 자동으로 돌아가게 하자. (PreBulid Event)
  • 일단 헤더들을 읽어서 generated.h를 만드는 것부터 시작하자.
  • HStruct 지정자가 있는 Class들을 읽어와서 Property 정보를 쭉 뽑아오자.
  • HStruct::StaticClass()를 generated.h에 구현한다.
    • StaticClass() 안에서는 읽어온 PROPERTY들을 HStruct의 Property 배열에 잘 넣어줄 수 있도록 하자.