Unity3D引擎设计(游戏对象/变换组件)背后的原因


14

我试图了解Unity3D引擎设计背后的原因,但我仍然无法理解:为什么将变换数据存储在单独的组件中,而不是像名称,图层蒙版和标签?无论如何,它不能像所有其他组件一样被删除,没有其他选择,因此也不需要删除它。


对我来说,这听起来像是建筑遗产。也许此转换组件曾经是常规的,可选的组件,所以您可以将对象置于笛卡尔空间之外。然后某些实现约束(优化?)要求此组件始终存在,并且保持这种状态。但这只是假设,需要Unity的工程师来真正回答这个问题。
洛朗·库维杜

Answers:


11

只有Unity开发人员才能为这种设计提供真正的动力,但是支持这种方式的一个论据是,有一个论据认为,软件项目中的每个类都应该承担一个责任。GameObject是一个命名的Components集合,并且向其中添加position / rotation / etc意味着它将承担2个职责。Transform组件处理位置和旋转,因此也不应该负责其他(可能不相关)组件的命名或汇总。因此,将这两个概念存在于两个单独的对象中是有意义的。

更普遍地,这个问题问“如果X和Y之间存在一对一的关系,为什么Y不是X的一部分,反之亦然?” 通常的答案是,即使将2个部分始终协同工作,将其分解成较小的独立部分,软件也更易于开发和维护。


我也考虑过,但由于相同的原因,他们本可以将GameObject过滤(图层,标签)移到一个单独的组件上,但事实并非如此。此外,通过保存层次结构数据(父级,子级等),转换组件在系统中的联系太深。
snake5 2012年

1
可以说,层和标签是一种命名形式,应该与名称并列,并且构成系统中组件集合的内在部分也是如此。至于持有育儿的转换,您有一点要说,但是没有人声称Unity系统是完美的。如果是我的系统,则将“变形”分开,并将父/子重新定位到GameObject。
Kylotan

1

转换是Unity中的必需组件。

变换是强制性组件的原因是游戏对象位于场景中,因此需要有关该对象的空间信息(位置,方向和比例)。(此信息并不总是使用,但保持强制转换组件会使事情变得更加简单)。


1
问题不在于基于组件的设计是什么。这就是为什么“转换”也不是组件的原因
bummzack,2012年

1
但是Transform是Unity中的一个组件!docs.unity3d.com/Documentation/ScriptReference/Transform.html。转换的唯一奇怪之处是它是GameObject的必需组件。
Mortennobel

好吧,我想那是关于您为什么不能删除它的问题?如果他不熟悉该术语,则OP不会将他的问题标记为“基于组件”。
bummzack,2012年

您说得对-谢谢。我已经更新了答案,以更好地回答这个问题。
Mortennobel

3
问题是为什么变换数据是一个单独的组件(与GameObject中的纯数据(如名称,图层蒙版,标签)相反)。我试图在我帖子的最新版本中更清楚地说明这一点。

0

TransformComponentComponent在视频游戏体系结构中最难正确设计的。几乎每个其他人都Component需要知道给定GameObject的位置,旋转或比例,因此要适当地将所有这些相互关联的系统去耦是固有的困难。

在架构上总会有取舍。通过TransformComponent保持静态(即非动态),Unity的开发人员可以在这种假设下编写代码。我认为这会使他们这边的事情变得容易得多,而不会给我们这边增加很多不便。这类似于一个面向对象的范例,GameObjectextend一些abstract classTransformable

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.