Component -> MeshRenderer는 Graphics의 인스턴스를 필요로 한다. 버퍼를 갖고 있도록 했기 때문이다. Component가 대체 어디까지 관여해야 하나? 어디까지 책임을 갖고 있어야 하는가?
후... 다시 차근차근 생각해보자.
Mesh Renderer 컴포넌트를 사용함으로써 얻는 이득은 무엇인가?
게임 오브젝트 초기화시 도움이 된다.
도움이 된다는 것은 다른 것과 비교했을 때 얻는 이득이 커야함. 컴포넌트를 사용한다는 건 이 모델에 대해서 이 컴포넌트를 붙였다 떼었다 하는 것 만으로 조립하듯 내가 원하는 걸 만들 수 있기 때문이다. 그러니까 컴포넌트 만드는 건 어쨌든 간에, 사용하는 건 반드시 편리해야 한다.
계층 구조를 살펴보면 GameObject는 반드시 Scene 내부에 존재하는 것이기 때문에, GameObject 내부에 위치한 Component도 Scene 내부에 있을 수 밖에 없다. 그러니까 이 두 명은 모두 Scene에게서 정보를 받아올 수 있어야 한다.
그러니 Scene에서 GameObject와 Component를 생성하도록 하는 Factory 함수가 있어도 괜찮을 것이라는 게 내 결론이다. 우선 Scene에서 GameObject를 생성하는 함수를 만들어보자.
GameObject* Scene::CreateGameObject(std::string name)
{
gameObjects[name] = std::make_unique<GameObject>(name);
return gameObjects[name].get();
}
대략 이런 식으로 만들었다. 컨테이너는 unoredered_map을 사용했다. 다만 현재 걸리는 점은 같은 이름의 GameObject가 존재할 경우 어떻게 해야하는 가이다. 생각한 방법은 각 객체에 고유번호를 매기는 것이다. 생성시 생성하려는 이름이 존재하는지 체크하여 다른 번호를 부여해 저장하는 식이다. 그러니까 pair<string, int> 이런식으로 페어로 만드는 방법이 있겠다.
두번째로는 아예 gameObject 객체가 아니라 vector를 가지고 해시맵을 만들어서 유니티처럼 FindObject("GameObject")를 하면 무조건 vector의 첫 요소가 리턴이 되고, FindObjects를 하면 같은 이름을 가진 모든 객체가 배열로 리턴되도록 하는 식이다.
'진행과정 기록 > GameEngine' 카테고리의 다른 글
20200114 (0) | 2020.01.14 |
---|---|
20200110 (0) | 2020.01.10 |
20200108 (0) | 2020.01.08 |
20200107 (0) | 2020.01.07 |
20190106 삼각형 (0) | 2020.01.06 |