碰撞体Collider
定义碰撞形状,用来进行碰撞检测,效率从最快到慢:
Sphere,Capsule,Box,Cilinder,Convex Mesh,Mesh
碰撞发生后,对象的OnCollisionEnter/Stay/Leave接口会被调用
RigidBody刚体
用来模拟碰撞后的物理表现效果
场景静态物体,只需要Collider。物理引擎对只有Collider的物体进行了优化,所以,改类物体不能移动,否则会导致物理引擎重新构建静态碰撞数据,并可能导致不确定状态,及不确定后果
如果不希望有物理表现,但又要能移动,则需要挂上RigidBody,并且设置为Kinematic选项。该类物体被称作动力学物体,表示不参与物理模拟运算,这能优化物理效率。同时别的物理对象会与它碰撞。比如受程序控制的门,角色。该选项不要在运行时设置,会产生效率开销
碰撞处理有三类:效率从快到慢(相对)
Static Collider, Kenimatic RigidBody, RigidBody
触发器 isTrigger
为Collider设置该选项,表示它是个触发器,别的物理对象与它发生碰撞后,不会有物理表现,仅通过OnTriggerEnter/Stay/Leave通知逻辑层。同时,只有带有RigidBody的对象才能触发触发器
碰撞组合体
Conver Mesh,Mesh类碰撞效率尤其低,对于复杂形状的碰撞体,如果可能,尽量用多个简单碰撞体组合表示
物理模拟中,比例和单位很重要
想象一下,摩天大楼,和砖头,都是Box类的刚体碰撞,碰撞后,一个慢慢倒下,一个立即倒下。
RigidBody碰撞选项有一个Collision Detection
表示碰撞计算方式,有三个选项:Discrete,Continuous,Continuous Dynamic,效率从高到低,精确度从低到高。Continuous用来解决高速移动物体和非告诉移动物体间碰撞问题,Continuous Dynamic用来解决2个告诉移动物体的碰撞检测。
ProjectSettings.Physics(2D)
由于物理的运算量比较大,所以引擎底层进行了很多优化,其中之一,就是允许用户定义Layer之间的碰撞开关,这非常重要,可以避免绝大多数不必要的碰撞运算,比如Layer UI 和 Layer Player,默认是进行物理检测(都是3D或2D)的,但根没有必要。在ProjectSettings.Physics里设置
Time.FixedTimeStep
还可以设置物理更新的频率,物理更新频率跟游戏的FPS没有直接关系(间接下面说),就算是游戏FPS只有1,物理也会按照设置的频率更新。比如CPU过热导致降频的FPS降低,会导致游戏的一帧进行更多的物理运算量。
Time.Maximum Allowed Timestep
这里是上面说的间接关系,每一游戏帧,允许物理更新的总时间。当出现上面说的FPS过低,导致每游戏帧过多物理帧时,如果物理运算总时间超过改时间,则改游戏帧不再更新物理
物理学参数,这里先不说了