Unity3D 엔진 설계의 원인 (게임 오브젝트 / 변환 컴포넌트)


14

Unity3D 엔진 디자인의 이유를 이해하려고하는데 아직 머리를 can 수없는 것입니다. 왜 이름, 레이어 마스크 및 태그? 어쨌든 다른 모든 구성 요소와 같이 제거 할 수 없으므로 대안이 없으므로 제거 할 필요가 없습니다.


나에게 이것은 마치 건축 유산처럼 들립니다. 어쩌면이 변환 구성 요소는 일반적이고 선택적인 구성 요소 였으므로 직교 공간에서 "밖으로"개체를 가질 수 있습니다. 그런 다음 일부 구현 제약 조건 (최적화?)은이 구성 요소가 항상 존재해야하며 이런 식으로 유지되었습니다. 그러나 그것은 단지 가정 일뿐입니다. Unity의 엔지니어가 그 질문에 실제로 답해야합니다.
Laurent Couvidou

답변:


11

Unity 개발자 만이이 디자인에 대한 진정한 동기를 부여 할 수 있지만, 이러한 방식으로이를 지원하는 데있어 한 가지 주장 은 소프트웨어 프로젝트의 각 클래스가 하나의 책임만을 처리해야한다는 주장입니다 . 게임 오브젝트는 컴포넌트의 이름이 지정된 컬렉션이며, 위치 / 회전 / 등을 추가하면 2 가지 책임이 있습니다. 변환 구성 요소는 위치와 회전을 처리하므로 다른 (잠재적으로 관련되지 않은) 구성 요소의 이름을 지정하거나 집계 할 책임도 없습니다. 따라서이 두 개념이 두 개의 개별 객체에 존재하는 것이 합리적입니다.

보다 일반적으로,이 질문은 "X와 Y 사이에 1 : 1 관계가 있다면, Y는 왜 X의 일부가 아니거나 그 반대입니까?" 그리고 일반적인 대답은 2 개의 부품이 항상 함께 작동하더라도 작은 독립형 부품으로 나눌 때 소프트웨어를 개발하고 유지 관리하기가 쉽다는 것입니다.


나는 그것을 고려했지만 같은 이유로 GameObject 필터링 (레이어, 태그)을 별도의 구성 요소로 옮길 수는 있었지만 그렇지 않았습니다. 또한 계층 구조 데이터 (부모, 자식 등)를 보유하여 변환 구성 요소가 시스템에 너무 깊게 연결되어 있습니다.
snake5

1
레이어와 태그는 이름의 한 형태이며 이름과 함께 있어야하며 시스템의 구성 요소 모음을 구성하는 본질적인 부분이라고 주장 할 수 있습니다. 육아를 유지하는 변형에 관해서는 요점이 있지만 아무도 Unity 시스템이 완벽하다고 주장하지는 않습니다. 그것이 내 시스템이라면, Transforms를 별도로 유지하고 부모 / 자녀를 GameObject로 재배치합니다.
Kylotan

1

Transform은 Unity의 필수 구성 요소입니다.

변환이 필수 구성 요소 인 이유는 게임 개체가 장면에 있고 해당 개체에 대한 공간 정보 (위치, 방향 및 크기)가 필요하기 때문입니다. 이 정보가 항상 사용되는 것은 아니지만 변환 구성 요소를 필수로 유지하면 상황이 좀 더 단순 해집니다.


1
문제는 컴포넌트 기반 디자인이 무엇인지에 관한 것이 아닙니다. 그것은 관하여 뿐만 아니라 "변환"왜 구성 요소가 아닙니다
bummzack

1
그러나 Transform은 Unity의 구성 요소입니다! docs.unity3d.com/Documentation/ScriptReference/Transform.html . 변형에 대한 유일한 이상한 점은 GameObject의 필수 구성 요소라는 것입니다.
Mortennobel

그럼 왜 당신이 그것을 제거 할 수 없는지에 대한 질문입니까? OP는 용어에 익숙하지 않은 경우 "구성 요소 기반"이라는 질문에 태그를 지정하지 않았습니다.
bummzack

네 말이 맞아-고마워 질문에 더 잘 대답하기 위해 답변을 업데이트했습니다.
Mortennobel

3
문제는 트랜스 폼 데이터가 왜 별도의 컴포넌트인지에 관한 것입니다 (이름, 레이어 마스크, 태그와 같은 GameObject 내부의 일반 데이터와 반대). 내 게시물의 최신 개정판에서 더 명확하게하려고했습니다.
snake5

0

TransformComponent가장 어려운 Component제대로 비디오 게임 건축 설계. 거의 모든 Component사람들이 주어진 GameObject위치, 회전 또는 스케일 에 대해 알아야 하므로 이러한 모든 관련 시스템을 적절하게 분리하는 것은 본질적으로 어렵습니다.

아키텍처에는 항상 상충 관계가 있습니다. 가짐으로써 TransformComponent정적 (즉,하지 동적), 유니티에서 개발자는이 가정에서 코드를 작성할 수 있습니다. 나는 이것이 우리 편에 많은 불편을 끼치 지 않고 그들의 편이 훨씬 쉬워 진다고 가정합니다. 이는 객체 지향 패러다임에 가깝다 GameObjectextend약간 abstract class, Transformable.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.