6.4 关节
Unity 4 3D开发实战详解
在现实生活中,大部分的运动物体并不是单独的一个简单基本体。对象要和其他对象进行交互,必须有其所谓的内在联系,例如枪械对象的设计。因为枪械对象的刚体组件不是简单的一个基本刚体组件组成的,需要多个子对象刚体组件的拼接来组成。这就需要关节中的固定关节来解决。
在Unity开发平台下,关节包括铰链关节(Hinge Joint)、固定关节(Fixed Joint)、弹簧关节(Spring Joint)、角色关节(Character Joint)及可配置关节(Configurable Joint)5种。通过关节组装可以轻松地实现人体、机车等游戏模型的模拟。下面将对各种关节一一地介绍。
6.4.1 铰链关节的特性
在Unity基本关节中,铰链关节是用途很广的一个。利用铰链关节不仅可以做门的模型,风车的模型甚至还可以做机动车的模型。
铰链关节是将两个刚体束缚在一起,在两者之间产生一个铰链的效果。它不仅可以用来制造门的特效,也可以做链条之类的特效。它的具体属性如下所示。
1.连接体(Connected Body)
连接体是铰链关节的第一个重要属性,也是所有关节的必备属性。连接体是关节所依赖的可选刚体参考对象。如果没有设定,则关节连接到世界空间中。可以在属性查看器中为关节指定连接体,且连接体必须添加了刚体组件。
2.锚点(Anchor)
锚点是指主体摇摆所围绕的坐标点。该坐标点定义于局部空间中。局部空间指的是关节所作用对象的物体空间。该空间的中心位置坐标为(0, 0, 0)点。此属性可以在属性查看器中修改。
3.坐标轴(Axis)
坐标轴是指主体摇摆所围绕的坐标轴的方向。该方向定义于局部空间中。此属性可以在属性查看器中修改,其中坐标(1,0,0)、(0,1,0)、(0,0,1)分别表示绕x、y、z轴摆动。
4.使用弹簧(Use Spring)
使用弹簧属性是布尔型的属性,表示在关节组件中是否使用弹簧。而弹簧的作用是使刚体相对其连接的主体达到一个特定的角度。此属性可以在属性查看器中通过是否勾选来确定该属性的启用与否。
5.弹簧(Spring)
弹簧属性是对应于使用弹簧属性的,只有当使用弹簧属性被启用时,此属性的子属性才能被使用。弹簧属性的所有属性如下。
- 弹簧力(Spring)
弹簧力表示维持对象移动到一定位置的力。
- 阻尼(Damper)
阻尼表示物体运动所受束缚的大小,此值越大,对象移动越缓慢。
- 目标位置(Target Position)
目标位置表示的是弹簧旋转的目标角度。弹簧负责将对象拉到这个目标角度,该角度以角度为单位而非弧度。
6.使用马达(Use Motor)
使用马达属性规定了在关节组件中是否需要使用马达。马达可以使其作用的对象绕坐标轴旋转。设定此值可以做出风车或者车辆的模型。
7.马达(Motor)
马达属性是对应于使用马达属性的,只有当使用马达属性被启用时,此属性的子属性才能被使用。马达属性的所有属性如下。
- 目标速率(Target Velocity)
目标速率表示对象试图达到的速度,对象的速度将会以此速度为目标加速或者减速。
- 力(Force)
此属性表示用于达到目标速率的力。
- 自由转动(Free Spin)
此属性规定了受控对象的旋转是否会被破坏。如果启用此属性,马达永远不会破坏旋转,只会加速。
8.使用限制(Use Limits)
此属性规定了在关节下的旋转是否受限。如果启用,铰链的角度将被限制在最大和最小之间。
9.限制(Limits)
限制属性是对应于使用限制属性的,只有当使用限制属性被启用时,此属性的子属性才能被使用。限制属性的所有属性如下。
最小(Min)
该属性规定了该对象旋转所能达到的最小角度。
最大(Max)
该属性规定了该对象旋转所能达到的最大角度。
最小弹跳(Min Bounce)
此属性规定了物体达到最小限值时的弹跳值。
最大弹跳(Max Bounce)
此属性规定了物体达到最大限值时的弹跳值。
10.破坏力(Break Force)
此属性给出了一个力的限值,当关节受到的力超过此限值时关节就会损坏。
11.破坏扭矩(Break Torque)
此属性给出了一个扭矩的限值,当关节受到的扭矩超过此限值时关节就会损坏。
说明
下面介绍的其他关节中的相同属性大多数在本质上都是相似的,因此,其他关节中的相同的属性只作简单介绍,不再作详细说明
。6.4.2 铰链关节的创建
上一小节介绍了铰链关节的特性,这一小节将介绍铰链关节的创建。在介绍关节之前请读者首先理解一点,关节是依附在刚体上的,也就是说必须有刚体的物体才能够添加铰链关节。铰链关节的创建步骤如下所示。
创建一个圆柱体对象。在菜单栏中单击“GameObject”,将会弹出“游戏对象操作”菜单,在此菜单中单击选择“Create Other”,继而在弹出的“创建其他”菜单中选择“Cylinder”。即创建了一个圆柱对象,如图6-73所示。
(2)创建一个立方体对象。在菜单栏中单击“GameObject”,将会弹出“游戏对象操作”菜单,在此菜单中单击选择“Create Other”,继而在弹出的“创建其他”菜单中选择“Cube”。即创建了一个圆柱对象,如图6-55所示。
(3)单击圆柱体对象,在属性查看器中,修改Transform组件中Position属性值为(0,0,0),如图6-74所示。单击选中立方体对象,在右侧的属性查看器中,修改其Transform组件中position属性的值为(0,0,0)。这样的设置是为了使圆柱和立方体位于摄像机的视野范围内,如图6-75所示。
(4)对立方体进行缩放,在y轴和x轴上进行拉伸,z轴上进行压缩。将其作为一个门板,并将圆柱和该门板方块摆放在如图6-76所示的位置。
(5)为两个对象添加刚体(Rigibody)。选中圆柱体,在菜单栏中选择Component,将会弹出“组件添加”菜单,在此菜单中单击选择“Physics”,继而在弹出的“物理”菜单中选择“Rigidbody”。选中立方体,重复上面的操作为圆柱体和方块添加刚体,如图6-77所示。
(6)添加铰链关节。选中方块对象,在菜单栏中选择Component,将会弹出“组件添加”菜单,在此菜单中单击选择“Physics”,继而在弹出的“物理”菜单中选择“Hinge Joint”,如图6-78所示。
(7)接下来在右侧的属性查看器中,修改关节参数,在Hinge Joint的Anchor属性组中修改参数分别为(0.5,0,0),并修改Axis中的参数分别为(0,1,0)。设置出关节的位置,如图6-79所示。
(8)选中圆柱体,在属性查看器中修改属性,在Constraints内,将所有的坐标轴选中,冻结该圆柱的运动,这样就只有门板可动。以此就可以制作出一个门的模型,如图6-80所示。
说明
为了观察关节的效果,可以将两刚体的刚体属性的UseGravity属性值为false。
6.4.3 固定关节的特性
在Unity基本关节中,固定关节起到的往往是组装的任务,利用固定关节可以拼接刚体。固定关节将两个刚体束缚在一起,使两者之间的相对位置永远不发生变化。它的具体属性如下所示。
1.连接体(Connected Body)
连接体是关节所依赖的可选刚体参考对象。如果没有设定,则关节连接到世界空间中。
2.破坏力(Break Force)
此属性给出了一个力的限值,当关节受到的力超过此限值时关节就会损坏。
3.破坏扭矩(Break Torque)
此属性给出了一个扭矩的限值,当关节受到的扭矩超过此限值时关节就会损坏。
6.4.4 固定关节的创建
上一小节介绍了固定关节的特性,这一小节将介绍固定关节的创建。在介绍关节之前请读者首先理解一点,固定关节是用来连接刚体的。固定关节的创建步骤如下所示。
(1)创建两个球体对象,具体操作顺序为GameObject→CreateOther→Sphere。将以上操作进行两次,得到两个球体。分别命名为“ball1”和“ball2”,如图6-40所示。为球体添加刚体。具体操作为Component→Physics→Rigidbody。
(2)为其添加固定关节。选中球体对象,在菜单栏中选择Component选项,然后在弹出的“组件”菜单中,选择“Physics”,然后选择“Fixed Joint”,如图6-81所示。
(3)为ball2指定固定关节的根,选中“ball2”游戏对象,在属性查看器中,单击Fixed Joint组件下的ConnectedRgidbody属性框,如图6-82所示。在弹出的刚体选择列表中选择ball1,如图6-83所示,即完成操作。
说明
为了观察关节的效果,可以将两刚体的刚体属性的UseGravity属性值设为false。
6.4.5 弹簧关节的特性
在Unity基本关节中,弹簧关节的效果极佳。利用弹簧关节可以模拟多种物理模型。弹簧关节将两个刚体束缚在一起,使两者之间像有一个弹簧的束缚一样。它的具体属性如下所示。
1.连接体(Connected Body)
连接体是关节所依赖的可选刚体参考对象。如果没有设定,则关节连接到世界空间中。
2.锚点(Anchor)
锚点表示的是对象基于局部空间的中心位置,是弹簧关节作用的位置。
3.弹簧(Spring)
此属性表示的是弹簧的劲度系数,此值越高,弹簧的弹性效果越强。
4.阻尼器(Damper)
此属性规定了弹簧在弹跳过程中,慢慢减速的特性。在此过程中会造成能量的损耗。
5.最小距离(Min Distance)
最小距离表示如果两物体的当前距离与初始距离差大于设定值,则不激活弹簧。
6.最大距离(Max Distance)
最大距离表示如果两物体的当前距离与初始距离差小于设定值,则不激活弹簧。
7.破坏力(Break Force)
此属性给出了一个力的限值,当关节受到的力超过此限值时关节就会损坏。
8.破坏扭矩(Break Torque)
此属性给出了一个扭矩的限值,当关节受到的扭矩超过此限值时关节就会损坏。
6.4.6 弹簧关节的创建
上一小节介绍了弹簧关节的特性,这一小节将介绍弹簧关节的创建。在介绍关节之前请读者首先理解一点,弹簧关节是依附在刚体上的,也就是说必须有刚体的物体才能够添加弹簧关节。弹簧关节的创建步骤如下所示。
(1)创建一个球体对象,具体操作顺序为GameObject→CreateOther→Sphere,如图6-40所示。为球体添加刚体。具体操作为Component→Physics→Rigidbody。
(2)为球体添加固定关节。将世界空间作为弹簧关节的根。选中球体对象,在菜单栏中选择Component选项,然后在弹出的“组件”菜单中,选择“Physics”,然后选择“Spring Joint”,如图6-84所示。
6.4.7 角色关节的特性
在Unity基本关节中,角色关节是应用较广的一个基本关节。利用角色关节可以模拟人体模型。角色关节大多用于布娃娃特效角色关节,是扩展的球关节,可以用于限制关节在不同旋转轴下的旋转角度。它的具体属性如下所示。
1.连接体(Connected Body)
连接体是关节所依赖的可选刚体参考对象。如果没有设定,则关节连接到世界空间中。
2.锚点(Anchor)
锚点这里指游戏对象局部空间中的点,关节绕此点转动。
3.坐标轴(Axis)
坐标轴这里指关节的扭轴,以橙色的gizmo圆锥显示。
4.摆轴(Swing Axis)
摆轴是指角色对象上某两个部分的摆动所绕的轴。以绿色的gizmo圆锥显示。
5.扭轴下限(Low Twist Limit)
扭轴下限为关节扭轴指定了下限,关节扭曲的角度不可低于此下限。
6.扭轴上限(High Twist Limit)
扭轴上限为关节扭轴指定了上限,关节扭曲的角度不可高于此上限。
7.摆轴限制1(Swing 1 Limit)
摆轴限制1为关节的摇摆定义了下限参数,绕摆轴的摆动角不能低于此下限。摆轴限制1限制了绕摆轴的旋转(绿轴),对摆轴旋转角度的限制是对称的,因此,如设置摆轴1的限制角度为30,则表示摆轴1的旋转被限制在30和30之间。
8.摆轴限制2(Swing 2 Limit)
摆轴限制2为关节的摇摆定义了上限参数,绕摆轴的摆动角不能高于此上限。摆轴限制2没有gizmo辅以显示,此轴垂直于扭轴和摆轴1构成的平面。与摆轴1相同,对摆轴2旋转角度的限制也是对称的,因此,如设置摆轴2的限制角度为40,则表示摆轴2的旋转被限制在40和40之间。
9.破坏力(Break Force)
此属性给出了一个力的限值,当关节受到的力超过此限值时关节就会损坏。
10.破坏扭矩(Break Torque)
此属性给出了一个扭矩的限值,当关节受到的扭矩超过此限值时关节就会损坏。
6.4.8 角色关节的创建
上一小节介绍了角色关节的特性,这一小节将介绍角色关节的创建。在介绍关节之前请读者首先理解一点,角色关节是依附在刚体上的,也就是说必须有刚体的物体才能够添加角色关节。角色关节的创建步骤如下所示。
(1)创建两个立方体对象,具体操作顺序为GameObject→CreateOther→Cube。将以上操作进行两次,得到两个Cube。分别命名为“cube1”和“cube2”,如图6-22所示。为立方体添加刚体。具体操作为Component→Physics→Rigidbody。
(2)为其添加角色关节。选中球体对象,在菜单栏中选择Component选项,然后在弹出的“组件”菜单中,选择“Physics”,然后选择“Character Joint”,如图6-85所示。
(3)选中“cube2”游戏对象,在属性查看器中,单击Character Joint组件下的ConnectedRgidbody属性框,如图6-86所示。在弹出的刚体选择列表中选择cube1,如图6-87所示,即完成操作。
说明
为了观察关节的效果,可以将两刚体的刚体属性的UseGravity属性值设为false。
6.4.9 可配置关节的特性
可配置关节是可定制的。可配置关节将PhysX引擎中所有与关节相关的属性都设置为可配置的,因此可以用此组件创造出与其他关节类型行为相似的关节。正是由于其强大的灵活性,也造成了其复杂性。下面将介绍一下可配置关节的主要属性。
1.锚点(Anchor)
锚点这里是关节的中心点,所有的物理模拟都使用此点作为中心进行计算。
2.主轴(Axis)
主轴这里是指局部旋转轴,定义了物理模拟下物体的自然旋转。
3.副轴(Secondary Axis)
主轴和副轴定义了关节的局部坐标系。第三个轴垂直于主轴和副轴。
4.x轴平移(Xmotion)
设置物体沿x轴的平移模式为自由的、锁定的或者受限于线性限制。
5.y轴平移(Ymotion)
设置物体沿y轴的平移模式为自由的、锁定的或者受限于线性限制。
6.z轴平移(Zmotion)
设置物体沿z轴的平移模式为自由的、锁定的或者受限于线性限制。
7.x轴角运动(Angular XMotion)
设置物体沿x轴的旋转模式为自由的、锁定的或者受限于基于x轴角运动下限和上限的限制。
8.y轴角运动(Angular YMotion)
设置物体沿y轴的旋转模式为自由的、锁定的或者受限于y轴角运动限制。
9.z轴角运动(Angular ZMotion)
设置物体沿z轴的旋转模式为自由的、锁定的或者受限于z轴角运动限制。
10.线性限制(Linear Limit)
以边界(离关节原点的距离)的形式定义的物体平移限制。
- 限制(Limit)
此属性是原点到边界的距离。
- 反弹力(Bouncyness)
此属性是当物体到达边界时对其施加的反弹力。
- 弹簧力(Spring)
此属性是将物体拉回限制(Limit)的力,任何非零数值将会隐式地软化边界。
- 阻尼器(Damper)
此属性是抵抗弹簧力的力量。
11.x轴角运动下限(Low Angular XLimit)
以边界(与关节初始旋转的差值)的形式定义的物体旋转下限。
- 限制(Limit)
此属性是对象旋转角度的下限值。
- 反弹力矩(Bouncyness)
此属性是当物体的旋转达到限制(Limit)时对其施加的反弹力矩。
- 弹簧力(Spring)
此属性是将物体拉回到限制(Limit)的力,任何非零数值将会隐式地软化边界。
- 阻尼器(Damper)
此属性是抵抗弹簧力的力量。
12.x轴角运动上限(High Angular XLimit)
此属性是以边界(与关节初始旋转的差值)的形式定义的物体旋转上限。
- 限制(Limit)
此属性是对象旋转角度的下限值。
- 反弹力矩(Bouncyness)
此属性是当物体的旋转达到限制(Limit)时对其施加的反弹力矩。
- 弹簧力(Spring)
此属性是将物体拉回到限制(Limit)的力,任何非零数值将会隐式地软化边界。
- 阻尼器(Damper)
此属性是抵抗弹簧力的力量。
13.y轴角运动限制(Angular YLimit)
以边界(与关节初始旋转的差值)的形式定义的物体旋转限制。
限制(Limit)
此属性是对象旋转角度的下限值。
- 反弹力矩(Bouncyness)
此属性是当物体的旋转达到限制(Limit)时对其施加的反弹力矩。
弹簧力(Spring)
此属性是将物体拉回到限制(Limit)的力,任何非零数值将会隐式地软化边界。
- 阻尼器(Damper)
此属性是抵抗弹簧力的力量。
14.z轴角运动限制(Angular ZLimit)
此属性是以边界(与关节初始旋转的差值)的形式定义的物体旋转限制。
- 限制(Limit)
此属性是对象旋转角度的下限值。
- 反弹力矩(Bouncyness)
此属性是当物体的旋转达到限制(Limit)时对其施加的反弹力矩。
- 弹簧力(Spring)
此属性是将物体拉回到限制(Limit)的力,任何非零数值将会隐式地软化边界。
- 阻尼器(Damper)
此属性是抵抗弹簧力的力量。
15.目标位置(Target Position)
此属性是关节应该到达的位置。
16.目标速度(Target Velocity)
此属性是关节应该到达的速度。
17.x轴驱动(XDrive)
此属性是定义关节如何沿x轴运动。
- 模式(Mode)
此属性可以设置为目标位置、目标速度或两者都是,默认是禁用(Disabled)模式。
- 位置弹力(Position Spring)
此属性是朝着预定义方向的橡皮拉力。只有当模式中包含目标位置时才有效。
- 位置阻尼(Position Damper)
此属性是抵抗位置弹力的力量。只有当模式中包含目标位置时才有效。
- 最大力(Maximum Force)
此属性是使物体达到预定义速度的力。只有当模式中包含目标速度时才有效。
18.y轴驱动(Ydrive)
此属性是定义关节如何沿y轴运动。
- 模式(Mode)
此属性可以设置为目标位置、目标速度或两者都是,默认是禁用(Disabled)模式。
- 位置弹力(Position Spring)
此属性是朝着预定义方向的橡皮拉力。只有当模式中包含目标位置时才有效。
- 位置阻尼(Position Damper)
\
此属性是抵抗位置弹力的力量。只有当模式中包含目标位置时才有效。 - 最大力(Maximum Force)
此属性是使物体达到预定义速度的力。只有当模式中包含目标速度时才有效。
19.z轴驱动(Zdrive)
此属性定义关节如何沿z轴运动。
- 模式(Mode)
此属性可以设置为目标位置、目标速度或两者都是,默认是禁用(Disabled)模式。
- 位置弹力(Position Spring)
此属性是朝着预定义的方向的橡皮拉力。只有当模式中包含目标位置时才有效。
- 位置阻尼(Position Damper)
此属性是抵抗位置弹力的力量。只有当模式中包含目标位置时才有效。
- 最大力(Maximum Force)
此属性是使物体达到预定义速度的力。只有当模式中包含目标速度时才有效。
20.目标旋转(Target Rotation)
此属性是用一个四元数来表示旋转。它定义了关节的旋转目标。
21.目标角速度(Target Angular Velocity)
此属性是用一个三维向量来表示角速度。它定义了关节的旋转角速度目标。
22.旋转驱动模式(Rotation Drive Mode)
此属性表示用x和yz角驱动或插值驱动控制物体的旋转。
23.x轴角驱动(Angular XDrive)
此属性定义关节如何绕x轴旋转。只有当旋转驱动模式为x&yz角驱动时才有效。
- 模式(Mode)
此属性可以设置为目标位置、目标速度或两者都是,默认是禁用(Disabled)模式。 - 位置弹力(Position Spring)
此属性是朝着预定义方向的橡皮拉力。只有当模式中包含目标位置时才有效。
- 位置阻尼(Position Damper)
此属性是抵抗位置弹力的力量,只有当模式中包含目标位置时才有效。
- 最大力(Maximum Force)
此属性是使物体达到预定义方向的力。只有当模式中包含目标速度时才有效。
24.y、z轴角驱动(Angular YZDrive)
此属性定义关节如何绕y轴和z轴旋转。只有当旋转驱动模式为x&yz角驱动时才有效。
- 模式(Mode)
此属性可以设置为目标位置、目标速度或两者都是,默认是禁用(Disabled)模式。
- 位置弹力(Position Spring)
此属性是朝着预定义方向的橡皮拉力。只有当模式中包含目标位置时才有效。
- 位置阻尼(Position Damper)
此属性是抵抗位置弹力的力量。只有当模式中包含目标位置时才有效。
- 最大力(Maximum Force)
此属性是使物体达到预定义方向的力。只有当模式中包含目标速度时才有效。
25.插值驱动(Slerp Drive)
此属性定义关节如何绕所有局部旋转轴旋转。只有当旋转驱动模式为插值时才有效。
- 模式(Mode)
此属性可以设置为目标位置、目标速度或两者都是,默认是禁用(Disabled)模式。
- 位置弹力(Position Spring)
此属性是朝着预定义方向的橡皮拉力。只有当模式中包含目标位置时才有效。
- 位置阻尼(Position Damper)
此属性是抵抗位置弹力的力量。只有当模式中包含目标位置时才有效。
- 最大力(Maximum Force)
此属性是使物体达到预定义方向的力。只有当模式中包含目标速度时才有效。
26.投影模式(Projection Mode)
此属性表示当物体离开它受限的位置太远时让它迅速回到它受限的位置。
27.投影距离(Projection Distance)
此属性表示当物体与连接体的距离差异超过投影距离后,物体才会迅速回到一个可接受的位置。
28.投影角度(Projection Angle)
此属性表示当物体与连接体的角度差异超过投影角度后,物体才会迅速回到一个可接受的位置。
29.在世界空间中配置(Congfigure in World Space)
此属性表示如果启用了此选项,所有与目标相关的计算都会在世界空间中进行,而不是在物体的本地空间中进行。
30.破坏力(Break Force)
此属性给出了一个力的限值,当关节受到的力超过此限值时关节就会损坏。
31.破坏扭矩(Break Torque)
此属性给出了一个扭矩的限值,当关节受到的扭矩超过此限值时关节就会损坏。
说明
在所有的关节中,可编辑关节是最为灵活的一个,但是由于其复杂性,在一般关节可以解决的情况下,尽量不要应用此关节。
6.4.10 可配置关节的创建
上一小节介绍了可配置关节的特性,这一小节将介绍可配置关节的创建。在介绍关节之前请读者首先理解一点,可配置关节是依附在刚体上的,也就是说必须有刚体的物体才能够添加可配置关节。可配置关节的创建步骤如下所示。
(1)创建两个立方体对象,具体操作顺序为GameObject→CreateOther→Cube。将以上操作进行两次,得到两个Cube。分别命名为“cube1”和“cube2”,如图6-22所示。为立方体添加刚体。具体操作为Component→Physics→Rigidbody。
(2)为其添加可配置关节。选中球体对象,在菜单栏中选择Component选项,然后在弹出的“组件”菜单中,选择“Physics”,然后选择“Configurable Joint”,如图6-88所示。
(3)选中“cube2”游戏对象,在属性查看器中,单击Configurable Joint组件下的ConnectedRgidbody属性框,如图6-89所示。在弹出的刚体选择列表中选择cube1,如图6-90所示,即完成操作。
说明
为了观察关节的效果,可以将两刚体的刚体属性的UseGravity属性值设为false。
6.4.11 关节综合案例——机械手
在本小节中介绍了关节的相关基础知识。为了加深读者理解,熟悉在开发中关节的用法,将在此部分介绍一个机械手的开发过程。机械手的具体步骤如下所示。
(1)新建一个场景,在菜单栏中选择File,打开文件操作按钮。选择New Scene,创建一个场景,如图6-91所示。按下快捷键Ctrl+S保存该场景,命名为“MachineArm”,如图6-92所示。
(2)新建一个平面。在菜单栏中选择“GameObject”选项,在弹出的“游戏对象操作”菜单中选择“Create Other”选项,在“创建其他”菜单中选择“Plane”。将此平面拖曳放置在摄像机视野之内,如图6-36所示。将资源列表中的地板纹理图资源拖拉到此平面上,为其指定纹理。
(3)选中摄像机“MainCamera”对象,在菜单栏中选择“Component”选项,在“组件添加”菜单中选择“Rendering”,在弹出的渲染菜单中选择“Skybox”,如图6-93所示。
(4)导入天空盒资源,在资源列表中的空白处鼠标右键单击,弹出资源操作列表,选择“Import Package”,如图6-94所示。在弹出的资源包列表中选择“Skyboxs”,如图6-95所示。经过此操作就导入了天空盒资源。
(5)为摄像机的天空盒指定类型,选中摄像机,在属性查看器中,单击Skybox的容器Custom Skybox属性右方的属性框,如图6-96所示。此时会弹出天空盒选择框,选择Sunny2 Skybox,如图6-97所示。
(6)新建一个球体对象。操作顺序为GameObject→CreateOther→Sphere,如图6-40所示。将球的纹理图拖曳到球体对象上,用于为球体指定纹理图,并对其适度缩放,效果如图6-98所示。
(7)新建4个Cube对象,具体操作步骤为GameObject→CreateOther→Cube,重复此操作的4个立方体对象,如图6-22所示。
(8)创建两个圆柱体对象,在菜单栏中单击GameObject,在弹出的游戏对象操作菜单中,选择“Create Other”,在弹出的菜单中选择Cylinder,重复两次这样的操作,如图6-99所示。
(9)将一个圆柱作为机械手的转轴,放置在摄像机的正前方,并对第(8)步所产生的立方体对象进行缩放平移。将一个圆柱进行缩放,作为机械手的连接杆,具体效果如图6-100所示。
(10)新建一个标签。选中转轴圆柱对象,在属性查看器中,单击Tag属性右侧的属性选择列表,选择Add Tag选项,如图6-101所示。
(11)经过上述操作,进入了标签与层添加器中,在Tag属性的Size属性右侧的编辑框中填写2。在Element0后面的文本框中输入main,Element1中添加ball,用以新建两个标签,如图6-102所示。
(12)为转轴圆柱体指定标签。再次选中圆柱体对象,在属性查看器中的Tag属性下拉列表中选择main,为其指定标签为“main”,如图6-103所示。
(13)选中第(7)步创建的球体对象,在属性查看器中的Tag属性下拉列表中选择ball,为其指定标签为“ball”,如图6-104所示。
(14)为6个立方体对象和两个圆柱体添加刚体。对6个对象进行如下同样的操作,选中操作对象,在菜单栏中选择Component,在弹出的组件菜单中选择Physics,然后在弹出的菜单中选择Rigidbody,即完成刚体的添加,如图6-77所示。
(15)接着依次选中对象,在属性查看器中,去掉刚体组件中UseGravity属性右侧的勾,以使所有对象不受重力作用,如图6-105所示。
(16)为各个物体进行命名。为6个立方体和两个圆柱体对象指定名称。所有的名称对应对象如图6-106所示。命名的方法为,选中要命名的对象,再次单击,然后依照所对应的名称输入内容即可,如图6-107所示。
说明
此处为对象命名,是为了方便后面指定关节关系。
(17)为各个物体添加关节。选中“zhou”对象,在菜单栏中选择Component选项,在弹出的菜单中选择“Physics”,然后在“物理”菜单中选择Fixed Joint,如图6-81所示。
(18)选中“zhou”对象,在属性查看器中,单击Fixed Joint的Connected Body属性后的属性框,如图6-108所示,然后在弹出的刚体选择框中选择“gan”,如图6-109所示。
(19)按照第(17)步和第(18)步的操作步骤,将left1、middle1和right1添加固定关节,并指定其连接体均为“zhou”。
(20)选中“left2”对象,在菜单栏中选择Component选项,在弹出的菜单中选择“Physics”,然后在“物理”菜单中选择Hinge Joint,如图6-78所示。
(21)选中“left2”对象,在属性查看器中,单击Hingeoint的Connected Body属性后的属性框,如图6-110所示。然后在弹出的刚体选择框中选择“left1”,如图6-111所示。
(22)在属性查看器中设置铰链关节的属性值,首先是Anchor的值分别为0,0.5,0。Axis的值为0、0、1。在Use Spring右侧打上勾表示选中,然后Spring的Damper值为2。Use Limits右侧打勾表示选中,Limits中的min值为0,Max值为5,如图6-112所示。
(23)按照步骤(20)~步骤(22)的操作,对middle2和right2进行设置,middle2所谓连接体为middle1,其Anchor的值为1、0、0。right2的连接体为right1,其Anchor的值为0、0、1。其他设置与left2完全相同。
(24)选中球体对象,将球体对象平移到机械手的正下方,如图6-113所示。
(25)在资源列表中鼠标右键单击,在弹出的菜单中选择Create,继而在弹出的菜单中选择JavaScript,为脚本命名为“MachineAnimation”,按下回车,接着双击该脚本,打开脚本编辑器编写脚本,实现机械手的向下运动,并抓住球体继而向上运用,具体代码片段如下。
1 private var speed : Vector3 = Vector3 (0, -24, 0); //声明下落速度
2 var i:int=0;
3 function Update()
4 {
5 if(this.transform.tag=="main"&&i==0)
6 {
7 rigidbody.MovePosition(rigidbody.position + speed * Time.deltaTime); //向下运动
8 }
9 if (i==1&&this.transform.tag=="main") //表示机械手要上升
10 {
11 rigidbody.MovePosition(rigidbody.position - speed * Time.deltaTime);//向上运动
12 }
13 if(Input.GetKey(KeyCode.Escape)) //为返回键添加监听
14 {
15 Application.Quit(); //退出程序
16 }}
17 function OnCollisionEnter(coll:Collision) //碰撞监听事件
18 {
19 if(coll.collider.tag=="ball") //与球发生触碰
20 {
21 i=1; //表示上升状态
22 this.rigidbody.freezeRotation=false; //冻结机械手
23 }}
- 第3-16行为实现机械手的上升下降功能,并实现了返回键的事件监听功能。一旦返回键被按下,就退出程序。
- 第17-23行为碰撞监听事件的处理,一旦发生碰撞就锁定机械手的旋转,即可夹住球体。
说明
因为left2、middle2和right2 这3部分在最初时虽然是受限的,但可以活动,在机械手下落至最低的时候,3部分会在惯性的作用下贴向球体,在此时将其旋转固定住,即可实行抓取。
(26)保存关闭脚本编辑器,在资源列表中进行操作,拖曳刚刚编写的脚本“MachineAnimation”至对象left1、left2、middle1、middle2、right1、right2、gan和zhou这8个对象上。
(27)游戏开发完毕,运行游戏查看游戏效果,游戏效果如图6-114、图6-115、图6-116和图 6-117所示。