Post

[CSEngine] Prefab & Scene

일반적인 오브젝트 생성의 직렬화부터, 특정 오브젝트의 레퍼런스를 가져오는 특수한 직렬화까지 모두 구현했습니다.

[CSEngine] Prefab & Scene

Prefab

하나의 인스턴스를 복제해서 사용하는 개념인 프리팹은 언리얼의 블루프린트 객체와 유니티의 프리팹과 비슷합니다.

프리팹 복제를 통해 30개의 인스턴스를 생성한 모습

유니티를 계속 써오긴 했지만 막상 프리팹이란 개념을 엔진에 넣고자 했을 때 고민을 많이 하였습니다. 고민은 다음과 같았습니다.

  1. 프리팹은 어떻게 만들 것인가?
    게임 오브젝트 그대로?
    프리팹 클래스에 프리팹 오브젝트를 상속해서?
    프리팹 클래스를 독립적으로 제작?

  2. 프리팹의 깊은 복사를 어떻게 이루어지게 할 것인가?
    일반적인 C++ 깊은 복사와 다른 의미이다.
    오브젝트와 컴포넌트 간의 레퍼런스도 모두 같은 방향으로 복사를 해야하는데 어떻게 구현할 것인가?

그렇게 저는 프리팹은 리소스의 형태, 프리팹 내부엔 게임 씬에 종속되지 않고 작동하지도 않는 게임 오브젝트가 있는 클래스로 만들었고
프리팹에서 복제한 게임 오브젝트는 깊은 복사를 통해 게임 씬에 넣는 방식으로 제작하였습니다.

프리팹 복제 원리

해당 복제 방식은 프리팹 뿐만 아니라 일반적인 게임 오브젝트, 씬 등에서도 사용됩니다. XML로 파싱하는 방식과 오브젝트를 복제하는 과정은 같으나 로직이 조금씩 달라 서로 다른 코드로 동작합니다.

기존에 만들어놨던 VariableBinder 클래스로 직렬화 된 리소스나 컴포넌트들의 역할이 매우 중요해졌습니다.
덕분에 일반적인 오브젝트 생성의 직렬화부터, 특정 오브젝트의 레퍼런스를 가져오는 특수한 직렬화까지 모두 구현이 가능해졌습니다.

Scene

엔진의 에디터에서 저장된 Scene을 불러온 모습

씬은 프리팹을 구현한 뒤로 객체화를 좀 더 세부적으로 들어간 덕분에 생각보다 큰 고민을 하지 않았습니다.

따라서 프리팹과 비슷한 개념으로 이루어져있습니다. 모든 게임 오브젝트의 최상단 노드를 담당하며, 오브젝트의 생명주기를 판단하는 역할이 포함된 특징들이 프리팹과 다른점입니다.

클래스와 해당 로직의 전반적인 구조는 소스코드는 아래의 문서에서 확인해주시면 감사하겠습니다.

CSEngine: C++ 문서

This post is licensed under CC BY 4.0 by the author.