Die Gründe für das Design der Unity3D-Engine (Spielobjekt- / Transformationskomponente)

14

Ich versuche, die Gründe für das Design der Unity3D-Engine zu verstehen, und das kann ich noch nicht verstehen: Warum werden Daten in einer separaten Komponente gespeichert, anstatt Teil von GameObject zu sein, wie z. B. Name, Ebenenmasken und Stichworte? Es kann ohnehin nicht wie alle anderen Komponenten entfernt werden, es gibt keine Alternativen und daher muss es nicht entfernt werden.

Schlange5
quelle
Für mich klingt das wie ein architektonisches Erbe. Vielleicht war diese Transformationskomponente eine reguläre, optionale Komponente, sodass Sie Objekte "außerhalb" des kartesischen Raums haben könnten. Dann erforderte eine Implementierungseinschränkung (eine Optimierung?), Dass diese Komponente immer vorhanden war, und dies blieb auch so. Aber das ist nur eine Vermutung, es würde einen Ingenieur von Unity brauchen, um diese Frage wirklich zu beantworten.
Laurent Couvidou

Antworten:

11

Nur die Unity-Entwickler können ihre wahre Motivation für diesen Entwurf angeben, aber ein Argument, das dies unterstützt, ist, dass es ein Argument gibt, dass jede Klasse in einem Softwareprojekt eine und nur eine Verantwortung übernehmen sollte . Das GameObject ist eine benannte Sammlung von Komponenten, und das Hinzufügen von Position / Drehung / usw. bedeutet, dass es zwei Verantwortlichkeiten hat. Die Transform-Komponente verwaltet Position und Drehung und sollte daher nicht für die Benennung oder Aggregation anderer (möglicherweise nicht zusammenhängender) Komponenten verantwortlich sein. Es ist also sinnvoll, dass diese beiden Konzepte in zwei separaten Objekten existieren.

Im Allgemeinen wird bei dieser Frage die Frage gestellt , warum Y nicht Teil von X ist und umgekehrt, wenn es eine 1: 1-Beziehung zwischen X und Y gibt. Und die allgemeine Antwort ist, dass Software einfacher zu entwickeln und zu warten ist, wenn sie in kleinere, in sich geschlossene Teile zerlegt wird, selbst wenn 2 Teile immer zusammenarbeiten.

Kylotan
quelle
Ich habe auch darüber nachgedacht, aber sie hätten die GameObject-Filterung (Ebenen, Tags) aus demselben Grund in eine separate Komponente verschieben können - und das taten sie auch nicht. Darüber hinaus ist die Transformationskomponente zu tief im System eingebunden, indem Hierarchiedaten (übergeordnete Elemente, untergeordnete Elemente usw.) gespeichert werden.
Schlange5
1
Es könnte argumentiert werden, dass die Ebenen und Tags eine Form der Benennung sind, neben dem Namen stehen sollten und somit ein wesentlicher Bestandteil dessen sind, was eine Sammlung von Komponenten im System ausmacht. Was Transformationen betrifft, bei denen die Elternschaft besteht, haben Sie einen Punkt, aber niemand hat behauptet, das Unity-System sei perfekt. Wenn es mein System wäre, würde ich Transforms getrennt halten und die Eltern / Kinder in das GameObject verschieben.
Kylotan
1

Transformation ist eine obligatorische Komponente in Unity.

Der Grund, warum eine Transformation eine obligatorische Komponente ist, besteht darin, dass sich Spielobjekte in einer Szene befinden und daher räumliche Informationen (Position, Ausrichtung und Maßstab) über dieses Objekt benötigen. (Diese Informationen werden nicht immer verwendet, aber wenn die Transformationskomponente obligatorisch ist, werden die Dinge ein bisschen einfacher).

Mortennobel
quelle
1
Die Frage ist nicht, was komponentenbasiertes Design ist. Es geht darum, warum "transformieren" nicht auch eine Komponente ist
Bummzack
1
Aber Transform ist ein Bestandteil von Unity! docs.unity3d.com/Documentation/ScriptReference/Transform.html . Das einzig seltsame an transform ist, dass es eine obligatorische Komponente für GameObject ist.
Mortennobel
Dann stellt sich wohl die Frage, warum Sie es nicht entfernen können. Das OP hätte seine Frage nicht als "komponentenbasiert" markiert, wenn er mit dem Begriff nicht vertraut gewesen wäre.
Bummzack
Sie haben recht - danke. Ich habe die Antwort aktualisiert, um die Frage besser beantworten zu können.
Mortennobel
3
Die Frage ist, warum Transformationsdaten eine separate Komponente sind (im Gegensatz zu normalen Daten in GameObject wie Name, Ebenenmasken, Tags). Ich habe versucht, dies in der letzten Überarbeitung meines Beitrags klarer zu machen.
Schlange5
0

Das TransformComponentist Componentin der Videospielarchitektur am schwierigsten zu entwerfen. Fast jeder andere Componentmuss über die GameObjectPosition, Drehung oder Skalierung eines bestimmten Objekts Bescheid wissen. Daher ist es von Natur aus schwierig, alle diese miteinander verbundenen Systeme ordnungsgemäß zu entkoppeln.

In der Architektur wird es immer Kompromisse geben. Wenn TransformComponentEntwickler bei Unity statisch (dh nicht dynamisch) sind, können sie unter dieser Annahme Code schreiben. Ich würde annehmen, dass dies die Dinge auf ihrer Seite viel einfacher macht, ohne dass dies für unsere Seite eine große Unannehmlichkeit darstellt. Das ist vergleichbar mit einem objektorientierten Paradigma, wo GameObjectwürden extendeinige abstract class, Transformable.

Alex
quelle