As razões por trás do design do mecanismo Unity3D (objeto do jogo / componente de transformação)

14

Estou tentando entender o raciocínio por trás do design do mecanismo Unity3D e isso é algo que ainda não consigo entender: por que transformar dados armazenados em um componente separado, em vez de fazer parte do GameObject, como nome, máscaras de camada e Tag? Ele não pode ser removido como todos os outros componentes de qualquer maneira, não há alternativas e, portanto, não é necessário removê-lo.

snake5
fonte
Para mim, isso soa como um legado da arquitetura. Talvez esse componente de transformação costumava ser um componente regular opcional, para que você pudesse ter objetos "fora" do espaço cartesiano. Então, algumas restrições de implementação (uma otimização?) Exigiam que esse componente estivesse sempre presente e permanecesse assim. Mas isso é apenas suposição, seria necessário um engenheiro da Unity para responder a essa pergunta de verdade.
Laurent Couvidou

Respostas:

11

Somente os desenvolvedores do Unity podem dar sua verdadeira motivação para esse design, mas um argumento para fazer isso é que há um argumento de que cada classe em um projeto de software deve lidar com uma e apenas uma responsabilidade . O GameObject é uma coleção nomeada de componentes, e adicionar posição / rotação / etc significa que ele teria duas responsabilidades. O componente Transform manipula posição e rotação e, portanto, também não deve ser responsável por nomear ou agregar outros componentes (potencialmente não relacionados). Portanto, faz sentido que esses 2 conceitos existam em 2 objetos separados.

De maneira mais geral, essa pergunta pergunta "se existe um relacionamento de 1 para 1 entre X e Y, por que Y não faz parte de X ou vice-versa?" E a resposta geral é que o software é mais fácil de desenvolver e manter quando dividido em partes menores e independentes, mesmo que duas partes sempre trabalhem juntas em conjunto.

Kylotan
fonte
Também considerei isso, mas eles poderiam ter movido a filtragem do GameObject (camadas, tags) para um componente separado pelo mesmo motivo - e, no entanto, não o fizeram. Além disso, o componente de transformação está vinculado demais ao sistema, mantendo os dados da hierarquia (pai, filhos etc.).
precisa saber é o seguinte
1
Pode-se argumentar que as camadas e tags são uma forma de nomeação, devem viver ao lado do nome e, portanto, são uma parte intrínseca do que constitui uma coleção de componentes no sistema. Quanto às transformações que mantêm os pais, você tem razão, mas ninguém afirmou que o sistema Unity é perfeito. Se fosse o meu sistema, eu manteria o Transforms separado e realocaria os pais / filhos para o GameObject.
Kylotan
1

A transformação é um componente obrigatório no Unity.

A razão pela qual uma transformação é um componente obrigatório é que os objetos do jogo estão localizados em uma cena e, portanto, precisam de informações espaciais (posição, orientação e escala) sobre esse objeto. (Essas informações nem sempre são usadas, mas manter o componente de transformação obrigatório mantém as coisas um pouco mais simples).

Mortennobel
fonte
1
A questão não é sobre o que é o design baseado em componentes. É por isso que "transformar" também não é um componente
#
1
Mas o Transform é um componente do Unity! docs.unity3d.com/Documentation/ScriptReference/Transform.html . A única coisa estranha sobre transformação é que ele é um componente obrigatório para GameObject.
Mortennobel
Bem, acho que a pergunta é por que você não pode removê-lo? O OP não teria marcado sua pergunta como "baseada em componentes" se ele não estivesse familiarizado com o termo.
bummzack
Você está certo - obrigado. Atualizei a resposta para melhor responder à pergunta.
Mortennobel 31/08/2012
3
A questão é sobre por que transformar dados é um componente separado (em oposição a dados simples dentro do GameObject, como nome, máscaras de camada, tags). Tentei deixar mais claro na última revisão do meu post.
precisa saber é o seguinte
0

O TransformComponenté o mais difícil Componentde projetar corretamente na arquitetura de vídeo game. Quase todos os outros Componentprecisam saber sobre a GameObjectposição, rotação ou escala de um dado , portanto, desacoplar adequadamente todos esses sistemas inter-relacionados é inerentemente difícil.

Sempre haverá trocas na arquitetura. Por TransformComponentserem estáticos (ou seja, não dinâmicos), os desenvolvedores do Unity podem escrever código sob essa suposição. Eu diria que isso facilita muito as coisas do lado deles, sem acrescentar muitos inconvenientes ao nosso lado. Isto é semelhante a um paradigma de orientação a objetos, onde GameObjectfaria extendalgum abstract class, Transformable.

Alex
fonte