Unity游戏开发入门经典(第4版)
上QQ阅读APP看书,第一时间看更新

2.3 变换

至此,你已经学习并且探索了不同的坐标系统,并且试验了一些游戏对象,现在应该把它们二者融合起来。在处理3D对象时,经常会听到变换(Transform)这个术语。根据上下文的不同,变换可以是一个名词或动词。3D空间里的所有对象都具有位置(Position)、旋转(Rotation)和缩放(Scale)。如果把它们都结合起来,就会得到对象的变换(名词)。此外,如果变换指的是更改对象的位置、旋转或缩放,那它就可以是一个动词。Unity把变换的两种含义与Transform组件结合起来。

Transform组件是唯一一个每个游戏对象都必须具有的组件,每个空游戏对象都有Transform组件。使用这个组件,可以查看对象的当前变换并改变(或变换)对象的变换。现在听着可能会令人疑惑,但它相当简单,要不了多久你就会了解它。由于变换由位置、旋转和缩放组成,改变变换就分别对应于移动、旋转和缩放这3种方法[这3种方法也被称为变换(Transformations)]。这些变换可以使用检查器视图或变换工具实现。图2.4和图2.5显示了哪些检查器视图组件或工具与哪些变换相关联。

图2.4 检查器视图中的变换选择

图2.5 变换工具

提示 在使用矩形前

矩形(Rect,Rectangle的缩写)这个概念常在2D游戏中被使用,比如说,对图片精灵(Sprite)这样的2D对象来说,矩形工具就像3D对象的变换工具,用来控制其位置、旋转和缩放(在图2.5中可以查看矩形工具的位置)。另外,Unity中用户界面(User Interface,UI)对象的变换通过一个叫Rect Transform(矩形变换)的组件来完成,第14章“用户界面”中将更细致地介绍这些内容;而现在,我们只需要知道Rect Transform组件就是普通移动对应的2D版,只针对UI对象使用。

2.3.1 移动

在3D系统中,改变对象的坐标位置的过程被称为移动,这是可以应用于对象的最简单的一种变换。在移动一个对象时,它将沿着一条轴移动。图2.6演示了一个沿着x轴移动的正方形。

图2.6 移动示例

当你选用了移动工具(快捷键:W)时,任何所选的对象在场景视图中都将稍有改变,更确切地讲,你将会看到3个箭头,它们沿着3根轴从对象的中心指向外面。这些是移动工具句柄,它们有助于你在场景中四处移动对象。单击并长按其中任何一个轴箭头会把它变成黄色,如果同时移动鼠标,对象将沿着那根轴移动。图2.7展示了移动工具句柄的样子。注意,这个句柄只会出现在场景视图中。

图2.7 移动工具句柄

提示 Transform组件和变换工具

Unity提供了两种方式来管理对象的变换,知道何时使用哪种方式很重要。用变换工具在场景视图中改变对象的变换时,变换数据也会在检查器视图中改变。在检查器视图中执行对象的较大变换会更容易,因为可以直接把对应值更改为目标值。不过,变换工具对于快速、较小的改变更有用。交叉使用这两种方式可以极大地改进工作流程。

2.3.2 旋转

旋转一个对象并不会在空间中移动它,但它会改变对象与那个空间的关系。简单来说,旋转能重新定义x轴、y轴和z轴对特定对象而言指向的是哪个方向。图2.8所示的是一个围绕z轴旋转的正方形。

图2.8 绕z轴旋转

提示 确定旋转轴

如果你不确定需要围绕哪根轴旋转对象来获得想要的效果,可以试试一种简单的方法:一次围绕一根轴旋转,假设对象被与那根轴平行的针固定在了某个位置,对象只能围绕固定它的针旋转,然后,确定哪根针让对象以你想要的方式旋转,它就是你所需要的轴。

就像变换工具一样,选择旋转工具(快捷键:E)会让旋转工具句柄出现在对象周围。这些句柄以圆形的形式呈现,分别对应对象围绕不同轴的旋转路径,单击并拖动其中任何一个圆形会将其变成黄色,并围绕那根轴旋转对象。图2.9展示了旋转工具句柄的样子。

图2.9 旋转工具句柄

2.3.3 缩放

缩放是在3D空间内扩展或收缩特定对象,这种变换在使用时会比较直观和简单。在任意轴上缩放一个对象都将改变它在那根轴上的尺寸。图2.10所示为在x轴和y轴上缩小一个正方形。图2.11显示了选择缩放工具(快捷键:R)时缩放工具句柄的样子。

图2.10 在x轴和y轴上缩放

图2.11 缩放工具句柄

2.3.4 变换的风险

如前所述,变换使用的是局部坐标系统。因此,此时所做的改变有可能会影响之后的变换,如图2.12所示,你可以发现当以相反的顺序应用两种相同的变换时,将获得两种不同的效果。

图2.12 不同变换顺序的效果

如你所见,不注意变换顺序将会导致一些意料之外的结果。幸运的是,你可以根据变换的一些一致性效果来决定具体的操作步骤。

 移动:移动是一种惰性相当强的变换,这意味着在它之后的任何改变一般不会受它影响。

 旋转:旋转将改变局部坐标系统的轴的方向,对象在旋转之后将沿着新的轴向移动。举例来说,如果你围绕z轴把对象旋转了180°,然后将其沿着y轴正方向移动,对象将向下(而不是向上)移动。

 缩放:缩放实际上改变了局部坐标栅格(Grid)的大小。事实上,当你放大一个对象时,放大的是其局部坐标系统,这就让对象看起来是扩大了的,而这种改变是具有乘法效应的。例如,把一个对象缩放到1(它的默认大小),然后沿着x轴向右移动5个单位,对象将向右移动5个单位;但如果把同一个对象缩放到2,然后在x轴上向右移动5个单位,对象将向右移动10个单位。这是由于局部坐标系统的大小翻了一倍(2×5=10);相反,如果把对象缩放到0.5然后移动5个单位,它只会移动2.5个单位(0.5×5=2.5)。

一旦理解了这些规则,就很容易确定一组变换将如何改变一个对象,而你选择的是局部坐标还是世界坐标,将影响这些变换的结果,所以最好先试验看看。

提示 一键使用多工具

工具栏中最后一个场景工具是组合工具(快捷键:Y),这个工具让你能同时进行移动、旋转或缩放一个3D对象。

2.3.5 工具句柄位置

对新手而言,由于不知道工具句柄(Gizmos)的显示选项是用来干什么的,会感到疑惑。事实上,这个选项是用来控制场景视图中变换工具句柄的位置和对齐方向的。在图2.13中可以对比看出选择局部或世界坐标空间后,移动工具句柄的对齐方向是如何改变的。

图2.13 局部或世界坐标下的工具句柄

另外,在图2.14中可以看到选择多个物体后句柄的位置变化。当选择了轴心选项时,句柄的中心将位于第一个被选择对象的中心;如果选择的是中心选项,句柄将处于所有选中对象的中心。

一般来说,保持轴心及局部的句柄选择,能避免一些问题,也能简化Unity的使用过程。

图2.14 轴心或中心选项下的句柄位置

2.3.6 变换或嵌套对象

在第1章“Unity简介”中,你已经学会了如何在层级视图中嵌套游戏对象(将一个对象拖动到另一个对象中)。当已有这样一个嵌套结构时,一级的对象是父对象,另一个则是子对象。对父对象而言,各种变换的应用都如前文所介绍的那样,可以移动、缩放或旋转。子对象的变换结果会有所不同,嵌套之后,子对象的变换是相对于父对象来进行的,而不是世界坐标系统,因此,一个子对象的位置不是根据其与原点的距离来决定的,而是根据其与父对象的距离来决定。如果父对象旋转了,子对象将随其一起旋转,如果此时查看子对象的旋转数据的话,会发现它并没有显示已旋转;缩放变换也是如此,子对象将跟随父对象一起缩放,但同时子对象本身的大小并没有改变。或许有些难以理解,但记住,当一个变换被应用时,它是被对象的坐标系统所应用而不是被对象所应用,对象并没有旋转,而是其坐标系统旋转了,只不过看起来是对象发生了旋转。而子对象的坐标系统是基于父对象的局部坐标系统的,因此父系统的任何改变都直接作用于子系统(而子系统根本不知道)。