enumclassCOMPONENT_TYPE:uint8{TRANSFORM,MESH_RENDERER,SCRIPT,END};enum{FIXED_COMPONENT_COUNT=static_cast<uint8>(COMPONENT_TYPE::END)-1,};classComponent{public:Component(COMPONENT_TYPEtype);virtual~Component();public:// GameObject의 흐름에 따라 Component를 갱신하기 위한 함수// 파생클래스에서 구현virtualvoidAwake()abstract;virtualvoidStart()abstract;virtualvoidUpdate()abstract;virtualvoidLateUpdate()abstract;public:shared_ptr<GameObject>GetGameObject(){return_gameObject.lock();}boolIsValid(){return_gameObject.expired()==false;}COMPONENT_TYPEGetType(){return_type;}private:COMPONENT_TYPE_type;weak_ptr<GameObject>_gameObject;// 현재 컴포넌트를 소유하는 GameObject};
classMeshRenderer:publicComponent{...private:// [📂. Material]에서 mesh에 material을 넣어서 관리하는 부분을 분리시키고 MeshRenderer클래스에서 각각을 관리한다.shared_ptr<Mesh>_mesh;shared_ptr<Material>_material;};
classGameObject:publicenable_shared_from_this<GameObject>{...public:// GameObject가 `실행되는 흐름`을 정하여 함수를 실행 voidAwake();// component들이 Awake를 실행voidStart();// component들이 Start를 실행voidUpdate();// component들이 Update를 실행voidLateUpdate();// component들이 LateUpdate를 실행voidAddComponent(shared_ptr<Component>component);private:array<shared_ptr<Component>,FIXED_COMPONENT_COUNT>_components;// 가지고 있는 모듈vector<shared_ptr<Script>>_scripts;// 스크립트 모듈};
개체가 enable_shared_from_this 기본 클래스에서 파생될 경우 shared_from_this 템플릿 멤버 함수는 이 인스턴스의 소유권을 기존 shared_ptr 소유자와 공유하는 shared_ptr 클래스 개체를 반환합니다. 그렇지 않으면 this에서 새 shared_ptr를 만들 경우 기존 shared_ptr 소유자와 완전히 다르므로 잘못된 참조가 발생하거나 개체가 두 번 이상 삭제될 수 있습니다. 개체가 아직 소유 shared_ptr 하지 않은 인스턴스를 호출 shared_from_this 하는 경우 동작이 정의되지 않습니다.
댓글남기기