본문 바로가기
DirectX/[Inflearn_rookiss] Part2: DirectX12

7. Component

by 헛둘이 2023. 1. 18.

유니티에서 보면 컴포넌트 개념이 있다

ex) Box Collider, Camera, Cube 등

 

유니티에서 Cube란 여러 컴포넌트들을 합쳐서 만들어진 무언가

-> 아무것도 없는 GameObject에 컴포넌트를 쌓아서 Cube를 만들 수 있음

 

일례로 행동을 정의하려면 MoveBehaviour를 상속받고 여기에 Update에서 움직임을 정의한다

-> MoveBehaviour는 한마디로 스크립트라고 해석됨

 

컴포넌트패턴은 부품을 다 조립해서 결과물을 만드는 것

이것이 유니티가 언리얼과 차별화된 부분

 

유니티는 빈 깡통에서 시작한다면, 언리얼은 기본적으로 메쉬 자체를 가지고 있다.

 


- 컴포넌트의 종류

  • Transform : 현재 오브젝트의 위치를 나타내는 컴포넌트
  • MeshRenderer : Material과 Mesh를 소유하고 그것들을 그려주는 컴포넌트
  • MonoBehaviour : 오브젝트의 행동을 정의하는 컴포넌트

더 추가될 수 있음

 

#pragma once
#include "Component.h"

class Transform;
class MeshRenderer;
class MonoBehaviour;

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 함수들을 통해

- 가지고 있는 컴포넌트들을 작동시킨다

 

 

enable_shared_from_this<class>는 뭐지?

- 컴포넌트에 스마트포인터를  this로 넘겨주기 위한 장치

- 저 클래스를 상속받으면 컴포넌트가 게임 오브젝트를 소유할 때 스마트포인터로 소유할 때 쉽게 넘겨줄 수 있다.

- 일반적으로 상속받을 때와 마찬가지로 public으로 상속받아야 한다..(그렇지 않으면 크래쉬 남... 10분 뻘짓함..)

 

void MeshRenderer::Render()
{
	//GetTransform()->Update();

	_material->Update();
	_mesh->Render();
}

- MeshRenderer의 Render에서는 Material과 Mesh의 작동을 관리한다 

 

 

Game 클래스에서의 변경점

shared_ptr<GameObject> gameObject = make_shared<GameObject>();
gameObject->Init(); // Transform

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);

- Mesh와 Material을 컴포넌트의 구성요소로 취급함으로써

- MeshRenderer에 포함시킨 후에 MeshRenderer를 다시 GameObject에 컴포넌트로 포함시킴

- 이전과 작동은 같으나 이렇게 처리함으로써 나중에 툴로 만들어서 Drag & Drop을 통해 쉽게 관리할 수 있다.

 

'DirectX > [Inflearn_rookiss] Part2: DirectX12' 카테고리의 다른 글

9. SRT 변환 행렬  (0) 2023.01.21
8. 행렬  (0) 2023.01.19
6. Material  (0) 2023.01.18
5. Depth Stencil Buffer/View  (0) 2023.01.17
4. Texture Mapping  (0) 2023.01.16

댓글