Причины дизайна движка Unity3D (игровой объект / компонент преобразования)


14

Я пытаюсь понять причины, лежащие в основе дизайна движка Unity3D, и это то, чего я пока не могу понять: почему данные преобразования хранятся в отдельном компоненте, а не являются частью GameObject, такими как имя, маски слоев и теги? В любом случае его нельзя удалить, как и все другие компоненты, альтернатив нет, и поэтому нет необходимости его удалять.


Для меня это звучит так, как будто это наследие архитектуры. Может быть, этот компонент преобразования раньше был обычным, необязательным компонентом, чтобы объекты могли быть «вне» декартового пространства. Затем некоторые ограничения реализации (оптимизация?) Требовали, чтобы этот компонент всегда присутствовал, и он остался таким. Но это только предположение, что инженеру из Unity потребуется ответ на этот вопрос по-настоящему.
Лоран Кувиду

Ответы:


11

Только разработчики Unity могут дать свою истинную мотивацию для этого дизайна, но один аргумент в поддержку такого подхода состоит в том, что есть аргумент, что каждый класс в программном проекте должен нести одну и только одну ответственность . GameObject - это именованная коллекция компонентов, и добавление положения / поворота / и т. Д. Означает, что у него будет 2 обязанности. Компонент Transform обрабатывает положение и поворот и поэтому не должен отвечать за присвоение имен или агрегирование других (потенциально не связанных) компонентов. Поэтому имеет смысл, чтобы эти 2 понятия существовали в 2 отдельных объектах.

В более общем плане, этот вопрос спрашивает: «Если между X и Y существует отношение 1 к 1, почему Y не является частью X или наоборот?» И общий ответ заключается в том, что программное обеспечение легче разрабатывать и поддерживать, если разбить его на более мелкие автономные части, даже если две части всегда работают вместе.


Я тоже это учел, но они могли переместить фильтрацию GameObject (слои, теги) в отдельный компонент по той же причине - и все же они этого не сделали. Кроме того, компонент преобразования слишком глубоко связан с системой, храня данные иерархии (родительский, дочерний и т. Д.).
snake5

1
Можно утверждать, что слои и теги являются формой именования, должны жить вместе с именем, и поэтому являются неотъемлемой частью того, что составляет набор компонентов в системе. Что касается преобразований, содержащих родительские элементы, у вас есть точка зрения, но никто не утверждал, что система Unity совершенна. Если бы это была моя система, я бы держал Transforms отдельно и переместил бы родителя / потомков в GameObject.
Kylotan

1

Преобразование является обязательным компонентом в Unity.

Причина, по которой преобразование является обязательным компонентом, заключается в том, что игровые объекты расположены на сцене и для этого требуется пространственная информация (положение, ориентация и масштаб) об этом объекте. (Эта информация не всегда используется, но сохранение обязательного компонента преобразования делает вещи немного проще).


1
Вопрос не в том, что такое компонентный дизайн. Это то, почему «преобразование» также не является компонентом
bummzack

1
Но Transform - это компонент Unity! docs.unity3d.com/Documentation/ScriptReference/Transform.html . Единственное, что странно в трансформации - это обязательный компонент для GameObject.
Мортеннобель

Ну, тогда я думаю, что вопрос в том, почему вы не можете удалить это? ОП не пометил бы его вопрос «на основе компонентов», если бы он не был знаком с этим термином.
Bummzack

Вы правы - спасибо. Я обновил ответ, чтобы лучше ответить на вопрос.
Мортеннобель

3
Вопрос в том, почему данные преобразования являются отдельным компонентом (в отличие от простых данных внутри GameObject, таких как имя, маски слоев, теги). Я постарался прояснить это в последней редакции моего поста.
snake5

0

Это TransformComponentнаиболее сложный Componentдля правильного проектирования в архитектуре видеоигр. Почти все остальные Componentдолжны знать о заданном GameObjectположении, вращении или масштабе, поэтому должное разделение всех этих взаимосвязанных систем по своей сути затруднительно.

В архитектуре всегда будут компромиссы. Будучи TransformComponentстатичными (то есть не динамическими), разработчики в Unity могут писать код в соответствии с этим предположением. Я предположил бы, что это делает вещи намного легче с их стороны, не добавляя большого количества неудобства с нашей стороны. Это похоже на объектно-ориентированную парадигму, где GameObjectбы extendкакой - то abstract class, Transformable.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.