本小节主要是Unity物理引擎,刚体碰撞方面的散记。

Character Controller的一些特性:
本身不受physics影响,需要接受外力作用时,使用onCharacterColliderHit().
Skin width:最好设置为radius的10%,防止角色经常卡住。
step offset:对于2meter高的Character最好设为0.1到0.4
min move distance设为0即可。

Rigidbody的属性设置:
Is Kinematic:打开后物体不受物理引擎影响,只受transform的控制。比如制作一个上升的平台,本身是rigidbody,且不受物理引擎影响,打开Is Kinematic.
Interpolate:使运动更光滑。
Freeze Rotation:使旋转不受碰撞或由script里定义施加的外力影响。只受tranform控制。

对rigidbody使用力的script方法:AddForce(),AddTorque().当使用physics时不要直接修改transform.


对于rigidbody,size是个比mass更重要的属性,所以在建模的时候强烈建议总是参考实际标准大小(unity中单位长度是米)。实时instantiate一个物体并修改它的大小,会影响其物理属性,因而会降低游戏性能。

两个rigidbody自由下落的速度不受mass影响,而是用drag(空气阻力)这个参数来控制。drag值越大,看起来感觉物体重量越轻(典型的0.001-金属块,10-羽毛)。

对rigidbody使用constant force组件来设置一个constant force,这个力可以是force或torque。
对物体施加constant force时,设置一个drag值可让物体加速到一个特定的最大速度以后不再加速。drag值越大这个速度越小。

某带有rigidbody的collider碰撞时会发送三个消息给该collider的对象,分别是Collider.OnCollisionEnter,Collider.OnCollisionExit和Collider.OnCollisionStay,这些事件可以在script里选择利用NVIDIA PhysX engine进行特别处理。

打开collider的Is trigger选项,碰撞就不受到物理引擎影响,而是通过发送三个消息变成某个事件的trigger。(同样的,发生碰撞的两个collider中至少有一个必须是rigidbody)这三个消息函数分别是:Collider.OnTriggerEnter,Collider.OnTriggerExit和Collider.OnTriggerStay.引发的事件可以是切换场景,开门,播放教程等等,自由发挥你的想象力。

总结下来:三种collider:
1.static collider: 带有collider却没有rigidbody的对象,最好用于静止物体如环境地理。
2.rigidbody collider:带有rigidbody的collider对象,能够根据物理引擎很好的响应外力和碰撞作用。
3.kinematic rigidbody collider:带有rigidbody的collider对象,开启Is kinematic之后,等效于可以频繁使用insform来移动(而非rigidbody collider利用外力或碰撞的物理效应)的static collider,用于需要rigidbody但不希望响应物理效果的对象。另外就是可以给其设置Is trigger,作为某些事件的触发器,但Is trigger的设置对象必须是rigidbody,但你又不希望其受物理定律约束的情形。

注:kinematic还常用来创造ragdoll.由于kinematic可以方便的开关,通常情况下开启kinematic方便角色移动等,但遇到碰撞、爆炸冲击等情况,可以在脚本里添加代码使其关闭kinematic变为普通的rigidbody接受物理作用。

Collision Action Matirx(各种碰撞属性对象碰撞的消息发送标准):


各种碰撞属性对象的碰撞消息发送标准


不难看出其中规律。



另外Unity3.X以后支持Layer-based Collision Detection,这个在后面script的学习里会详细介绍。



两个mesh collider不能互相碰撞除非都设为convex。mesh collider设置为convex有个限制,这个mesh必须少于255个三角形。



Physics Material:设置物体的弹性,摩擦系数,软硬程度的组件。



Hinge Joint:关节组件。用于门的轴或者链条等。



Spring Jonit:弹簧组件。实时创建和调整spring的方法——创建一个空的game object作为spring绑定的connected body对象,在脚本里控制这个空的game object从而有效控制spring.