본문 바로가기

그래픽스

[DX12] Comoponent

 

이번에는 게임 엔진에서 사용되는 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