【Unity】第11章 第三人称角色控制器和碰撞体
分类:Unity、C#、VS2015
创建日期:2016-05-02
一、简介
第三人称视角控制器涉及的相关概念有:
1、刚体(Rigidbody)。
2、碰撞体(Collider)。包括球体碰撞体(Sphere Collider)、箱体碰撞体(Box Collider)、网格碰撞体(Mesh Collider)、物理材质(Physics Material)、铰链关节(Hinge Joint)、弹簧关节(Spring Joint)等。
Unity内置了 NVIDIA PhysX 物理引擎。要控制场景中的物理对象,只需对该对象添加刚体 (Rigidbody)。执行此操作后,该对象就会受重力的影响,而且还可以将该对象与世界坐标系中的其他对象进行碰撞检测。
二、本章要点
1、刚体
刚体 (Rigidbody) 是以物理方式模拟的对象。可将刚体 (Rigidbody) 用于玩家可以四处推动的事物(例如板条箱或松散对象),或通过编写脚本向刚体 (Rigidbody) 应用力来直接移动它。
如果对非运动学刚体 (non-Kinematic Rigidbody) 进行变换,则可能不会与其他对象正确碰撞,因此应通过对刚体 (Rigidbody) 应用力和扭矩来移动它。另外,还可以向刚体 (Rigidbody) 添加关节 (Joint) 以使行为更复杂。例如,可以创建具有物理门,或创建具有摇摆链条的起重机等。
还可使用刚体 (Rigidbody) 使车辆显得生动,例如可以用一个刚体、四个车轮碰撞体 (Wheel Collider) 以及一个基于用户输入应用车轮旋转力的脚本来创建汽车。
可以通过从脚本向刚体 (Rigidbody) 应用力来创建飞机。
刚体 (Rigidbody) 最常与基元碰撞体 (Primitive Collider) 结合使用。
重要提示:
- 绝不应一起使用父和子刚体 (Rigidbody)
- 绝不应缩放刚体 (Rigidbody) 的父级
2、运动学刚体 (Kinematic Rigidbody)
运动学刚体 (Kinematic Rigidbody) 是指启用了“运动学”(is Kinematic) 选项的刚体。运动学刚体 (Kinematic Rigidbody) 不受力、重力或碰撞的影响。它们通过设置变换的位置和旋转或对其进行动画处理来驱动,运动学刚体还可以与其他非运动学刚体 (non-Kinematic Rigidbody) 进行交互。
运动学刚体 (Kinematic Rigidbody) 可在与其他刚体 (Rigidbody) 碰撞时正确唤醒它们,并会对置于其上的刚体 (Rigidbody) 应用摩擦力。
下面是针对运动学刚体 (Kinematic Rigidbody) 的几个使用情况的示例:
(1)希望某个对象处于物理控制下,但是其他情况下则是通过脚本或动画进行控制。例如,可以创建一个动画角色,其骨骼附加了与关节 (Joint) 连接的刚体 (Rigidbody),以用作布娃娃。大多数时候该角色处于动画控制下,此时会创建运动学刚体 (Kinematic Rigidbody)。但是当命中它时,又希望它变为布娃娃并受物理影响。为实现此目的,只需禁用“运动学”选项,即让“is Kinematic”为false即可。
(2)需要某个对象可以推动其他对象、但不推动自己移动的对象。例如,如果有一个动画平台,并且要在其上放置一些刚体 (Rigidbody) 箱体,则应使该平台成为运动学刚体 (Kinematic Rigidbody) 而不仅仅是不带刚体 (Rigidbody) 的碰撞器 (Collider)。
(3)可能需要某个对象有一个经过动画处理的运动学刚体 (Kinematic Rigidbody),并使用一个可用的关节 (Joint) 让真实刚体 (Rigidbody) 跟随其后。
3、静态碰撞组件 (Static Collider)
静态碰撞组件 (Static Collider)是具有碰撞体 (Collider) 而不是刚体 (Rigidbody) 的游戏对象 (GameObject)。静态碰撞体 (Static Collider) 用于始终保持在相同的位置并且永远不会四处移动的水平几何结构。
既可以将网格碰撞组件 (Mesh Collider) 添加到已存在的图形网格,例如使用导入设置 (Import Settings) 生成碰撞体 (Generate Colliders),也可以使用其他碰撞组件。
绝不应逐帧移动静态碰撞体 (Static Collider),或者说,只要将其设置为静态碰撞体,它就应该从始至终都不会在场景中移动。否则就会导致物理引擎重新进行内部计算,这种计算成本十分高昂,还会使性能显著下降。不仅如此,基于静态碰撞体 (Static Collider) 唤醒其他刚体 (Rigidbody) 的行为未定义,并且移动静态碰撞体 (Static Collider) 不会对与之接触的刚体 (Rigidbody) 应用摩擦力。
总之,凡是在场景中移动的碰撞体 (Collider) ,都应该始终将其设置为运动学刚体 (Kinematic Rigidbody),而不是将其设置为静态碰撞体。