
이번에는 게임 엔진에서 사용되는 Component를 만들어보겠다. Component들의 조합으로 GameObject들을 만들 수 있다.
shared_ptr<MeshRenderer> meshRenderer = make_shared<MeshRenderer>();
{
shared_ptr<Mesh> mesh = make_shared<Mesh>();
mesh->Init(vec, indexVec);
meshRenderer->SetMesh(mesh);
}
{
shared_ptr<Shader> shader = make_shared<Shader>();
shared_ptr<Texture> texture = make_shared<Texture>();
shader->Init(L"..\\Resources\\Shader\\default.hlsli");
texture->Init(L"..\\Resources\\Texture\\veigar.jpg");
shared_ptr<Material> material = make_shared<Material>();
material->SetShader(shader);
material->SetFloat(0, 0.3f);
material->SetFloat(1, 0.4f);
material->SetFloat(2, 0.3f);
material->SetTexture(0, texture);
meshRenderer->SetMaterial(material);
}
gameObject->AddComponent(meshRenderer);
MeshRenderer에 Mesh와 Material을 세팅하고 그것을 gameObject에 추가했다.
class GameObject : public enable_shared_from_this<GameObject>
{
public:
GameObject();
virtual ~GameObject();
void Init();
void Awake();
void Start();
void Update();
void LateUpdate();
shared_ptr<Transform> GetTransform();
void AddComponent(shared_ptr<Component> component);
private:
array<shared_ptr<Component>, FIXED_COMPONENT_COUNT> _components;
vector<shared_ptr<MonoBehaviour>> _scripts;
};
gameobject는 awake, start, update, lateupdate 등의 라이프사이클을 가지고 있고 components와 scripts를 가지고 있다. scripts는 개수가 제한되지 않지만 components는 한 종류당 하나만 가질 수 있기 때문에 array로 선언된다.
class GameObject;
class Transform;
class Component
{
public:
Component(COMPONENT_TYPE type);
virtual ~Component();
public:
virtual void Awake() { }
virtual void Start() { }
virtual void Update() { }
virtual void LateUpdate() { }
public:
COMPONENT_TYPE GetType() { return _type; }
bool IsValid() { return _gameObject.expired() == false; }
shared_ptr<GameObject> GetGameObject();
shared_ptr<Transform> GetTransform();
private:
friend class GameObject;
void SetGameObject(shared_ptr<GameObject> gameObject) { _gameObject = gameObject; }
protected:
COMPONENT_TYPE _type;
weak_ptr<GameObject> _gameObject;
};
gameobject는 보유한 모든 components에 대해 awake, start, update ,lateupdate를 실행한다. component는 어떤 gameobject가 자신을 소유하는지 weak_ptr로 들고 있다. (순환 참조를 방지하기 위해)
'그래픽스' 카테고리의 다른 글
| [DX12] Lighting 코드 #1 (0) | 2022.07.25 |
|---|---|
| [DX12] Camera (0) | 2022.07.24 |
| [DX12] Material (0) | 2022.07.23 |
| [DX12] Depth Stencil View (0) | 2022.07.23 |
| [DX12] Texture Mapping (0) | 2022.07.23 |