[1]. Client 프로젝트에서 만들어 두었던, GameObejct 중의 하나인 BackGround 객체에 Engine 프로젝트의 Component 를 추가하는 작업을 해본다.

[2]. 크게 2가지인데, Component 클래스의 자식 클래스인, Transform 클래스와 Texture 클래스를 추가할 것이다.

[3]. 가장 먼저 Transform 클래스를 추가하려고 하는데, 생각을 해보면, 이 Transform 이 담당하는 역할은, 각 객체들마다 갖는 다른 특성들, 예를 들어 Player 의 Transform 과 Monster 의 Transform 이 다를 것이기에, 원형 객체를 Clone화 하여 추가하는게 아니라, 아예 Client 프로젝트에서 객체들이 Create되고 초기화 작업을 거치는 동안, 스리슬쩍~ Transform Component 를 추가하는 식으로 진행하려고 한다.

[4]. 따라서, Componenet 부모 클래스의 Clone 함수를 이용하지 않을 것이기에, override 를 해제하고,

image.png

GameObject 클래스의 원형 객체용 Initialize_Prototype 함수가 아닌, Initialize(void* _pArg) 함수를 이용한다.

[5]. 함수의 내용을 보면, 구조체가 선언되어 있는데, 이는 잠시 Client 의 BackGround 객체에 Engine 프로젝트에서의 Transform이 BackGround 객체가 만들어지면서 바로 Transform 의 정보를 받아올 수 있느냐 체크하기 위해서 임시적으로 선언해두었다.

[6]. 이 구조체의 흐름은, Transform → GameObject → BackGround 로 구조체의 상속 관계를 통해 정보가 넘어가고 있다.

[7]. 부모 클래스인, GameObject를 Initialize할 때, Transform 을 생성하고, 그걸 멤버변수에 담아 둔다. 그러고 나서 생성된 Transform의 주소를 GameObject 클래스가 갖고 있는 map 컨테이너에 담아서 보관을 시켜놔야 하는데, 키 값은 Com_Transform 이라는 이름의 전역 string 값을 하나 만들어서 넣어주자.

[8]. 부모 클래스인 GameObject 클래스에서 저렇게 해놓으면, 결국 자식 클래스인 BackGround 클래스의 입장에서는, 원형을 만들고 나서, 사본 객체를 복사할 때, Transform의 구조체 정보를 상속을 통해 함께 자동으로 호출하게 된다.

image.png

이제 저기서, Transform 클래스를 통한 구조체의 상속 전달이 잘 진행된 것을 확인할 수 있다.

[9]. Transform 클래스와 다른, Texture 클래스를 다시 한 번 추가한다. 이번에는, 아까의 방식과는다르게, Clonet 화를 이용해서, 추가를 할 것이다. Ready_Componenet 함수는, Component를 준비한다는 함수이므로, 저 함수 안에, Add_Component 라는 이름의 함수가 작성된다. 이 함수를 만들지 않고 진행하려면, BackGround 와 같은 GameObject 자식 클래스 마다 항상 CTransform 클래스를 선언해주고, 그 클래스의 멤버변수를 또 만들어서, 그 변수 안에다가 대입해주는 식으로 진행해야하는데, 이런 행위를 안하려고, 부모 클래스인 GameObject 클래스에 아예 함수를 하나 만들어 두는 것이다.

[10]. Add_Component 함수의 목적은, [원형 level 의 원형 key 값의 정보를 가진 원형 객체를 복사!] 하는 것이다.

[11]. 이 함수는 다음과 같이 작성된다.

image.png

[12]. 주목할 점은, 함수의 4번 째 파라미터인, 2중 포인터 부분인데, 이는 Component 타입을 map 컨테이너의 value값으로 담아주기 위함인데, 부모 클래스에서 이렇게 작성하니, BackGround 클래스 입장에서는, Texture 클래스가, 즉 자식 클래스가 선언되어있는데, 받아오기 위해서 업캐스팅을 해줘야만 한다. “reinterpret_cast”를 통해 Texture 클래스를 Component 클래스로 업캐스팅해서 파라미터를 채운다.

[13]. 결국 BackGround 에 Initialize 함수에 실행 되었던 일들은, 2가지의 Component 를 추가하는 행위였고, 하나는 Transform의 구조체 상속을 통한, 시작할 때 그냥 바로 전달해서 추가하는 방식,

Ready_Component 라는 함수를 통해, 원형 객체 사본화를 통한 추가.