유니티에서 보면 컴포넌트 개념이 있다
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 |
댓글