Input for OpenVR controllers
Unity 中的旋转和方向

变换组件

__变换组件__用于存储游戏对象的位置、旋转、缩放和父子化状态,因此非常重要。游戏对象始终附加一个变换组件,无法删除变换组件或创建没有变换组件的游戏对象。

编辑变换组件

在 3D 空间中可在 X、Y 和 Z 轴上操作变换组件,但在 2D 空间中只能在 X 和 Y 轴上操作。在 Unity 中,这些轴分别由红色、绿色和蓝色表示。

一个用颜色标示不同轴的变换组件
一个用颜色标示不同轴的变换组件

可以在 Scene 视图中编辑变换组件,也可以在 Inspector 中更改其属性。在场景中,可以使用移动、旋转和缩放工具修改变换组件。这些工具位于 Unity Editor 的左上角。

查看、移动、旋转和缩放工具
查看、移动、旋转和缩放工具

这些工具可用于场景中的任何对象。单击对象时,对象中将出现工具辅助图标。辅助图标的外观取决于选择的工具。

变换组件辅助图标
变换组件辅助图标

When you click and drag on one of the three gizmo axes, you will notice that its color changes to yellow. As you drag the mouse, you will see the object translate, rotate, or scale along the selected axis. When you release the mouse button, the axis remains selected. If you subsequently drag with the middle mouse button, the axis last selected will be used regardless of the mouse position.

一个已选中(黄色)X 轴的变换组件
一个已选中(黄色)X 轴的变换组件

在移动模式中还有一个附加选项可以锁定面向特定平面的移动(即允许在两个轴上拖动的同时保持第三个轴不变)。围绕移动辅助图标中心的三个小彩色方块可激活每个平面的锁定功能;这些颜色对应于单击方块时将锁定的轴(例如,蓝色锁定 Z 轴)。

父子化

父子化是使用 Unity 时需要理解的最重要概念之一。当一个游戏对象是另一个游戏对象的__父__项时,__子__游戏对象完全跟随其父项移动、旋转和缩放。可将父子化看作是手臂与身体之间的关系;每当身体移动时,手臂也随之移动。子对象也可以有自己的子项,以此类推。所以,手可以视为手臂的“子项”,然后每只手都有几根手指,等等。任何一个对象都可以有多个子项,但只有一个父项。这些多级父子关系形成了变换组件的_层级视图。层级视图最顶层的对象(即层级视图中唯一没有父项的对象)称为__根_。

将 __Hierarchy 视图__中的任何游戏对象拖到另一个游戏对象上即可创建父项。这样就会在这两个游戏对象之间建立父子关系。

父子层级视图的示例。名称左侧有折叠箭头的游戏对象表示父项。
父子层级视图的示例。名称左侧有折叠箭头的游戏对象表示父项。

请注意,Inspector 中任何子游戏对象的 Transform 值都是相对于父项 Transform 值显示的结果。这些值称为__局部坐标__。回到刚才身体和手臂的类比,身体的位置可能会随着人的行走而移动,但手臂相对于身体的位置不变。在进行场景构建时,通常使用子对象的局部坐标就足够了,但在游戏中通常需要找到这些对象在世界空间或__全局坐标__中的确切位置。变换组件的脚本 API 具有局部和全局位置、旋转和缩放的单独属性,还允许在局部和全局坐标之间转换任何点。

非一致缩放的限制

非一致缩放是指变换组件中的 Scale 具有不同的 x、y 和 z 值;例如 (2, 4, 2)。相反,一致缩放则具有相同 x、y 和 z 值;例如 (3, 3, 3)。在一些特殊情况下,非一致缩放可能很有用,但这种缩放方式会导致一致缩放所没有的一些奇怪现象:

  • 某些组件不完全支持非一致缩放。例如,有些组件具有由 radius 属性定义的圆形或球形元素,这些组件包括__球形碰撞体 (Sphere Collider)胶囊碰撞体 (Capsule Collider)光源 (Light)__ 和__音频源 (Audio Source)__。在这种情况下,圆形形状不会像预期的那样在非一致缩放下变成椭圆形,而是仍然保持圆形。
  • 当子对象具有非一致缩放的父项并且相对于该父项旋转时,子对象可能看起来是倾斜或“截断”的。有些组件支持简单的非一致缩放,但在有这种倾斜的情况下无法正常工作。例如,倾斜的__盒型碰撞体 (Box Collider)__ 无法准确匹配渲染网格的形状。
  • 出于性能原因,如果父项非一致缩放,子对象在旋转时不会自动更新其缩放比例。因此,当缩放比例最终_更新_时,子对象的形状可能会突然发生变化,例如在子对象与父项分离的情况下。

缩放比例的重要性

变换组件的缩放比例决定了网格在建模应用程序中的大小与该网格在 Unity 中的大小之间的差异。Unity 中的网格大小(因此也就是变换组件的缩放比例)_非常_重要,尤其是在物理模拟过程中。默认情况下,物理引擎假定世界空间中的一个单位对应于一米。如果一个对象非常大,可能会出现“慢动作”问题;模拟实际上自生效以来是正确的,但您会看到非常大的对象滞后很远的距离。

有三个因素会影响对象的缩放比例:

  • 网格在 3D 建模应用程序中的大小。
  • 对象的 Import Settings 中的 Mesh Scale Factor 设置。
  • 变换组件的 Scale 值。

理想情况下,不应在变换组件中调整对象的 Scale 设置。最好的选择是以真实比例创建模型,这样就不必更改变换组件的比例。次好的选择是在具体网格的 Import Settings 中调整导入网格时的比例。有些优化是基于导入大小进行的,因此实例化调整了比例值的对象可能会降低性能。有关更多信息,请参阅刚体 (Rigidbody) 组件参考页面上关于优化缩放比例的部分。

关于使用变换组件的提示

  • 在设置变换组件的父子关系时,一种有用的做法是在添加子项之前将父项的位置设置为 <0,0,0>。这意味着子项的局部坐标将与全局坐标相同,因此更容易确保子项处于正确位置。
  • __粒子系统__不受变换组件的__缩放比例__所影响。为了缩放粒子系统,需要修改系统的粒子发射器、动画器和渲染器中的属性。
  • 如果使用__刚体__进行物理模拟,请务必阅读刚体组件参考页面上的 Scale 属性。
  • 可通过偏好设置(菜单:__Unity > Preferences__,然后选择 Colors & keys 面板)更改变换轴(和其他 UI 元素)的颜色。
  • 更改缩放比例会影响子项转换组件的位置。例如,将父项的缩放比例调整到 (0,0,0) 将使所有子项相对于父项位于 (0,0,0) 位置。
Input for OpenVR controllers
Unity 中的旋转和方向