Unity学习笔记2:物理引擎和碰撞
2013-03-17 09:53 Mr.Raindrop 阅读(730) 评论(0) 编辑 收藏 举报本小节主要是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.
collision detection:高速运动的碰撞体应设为continuous,防止出现上一帧在其他碰撞物体的这边,下一帧已经穿过碰撞物体到达另一边的情形。默认为discrete.只有box,sphere和capsule的collider才能设置为continuous.
对于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(各种碰撞属性对象碰撞的消息发送标准):
![](http://img-my.csdn.net/uploads/201303/17/1363485695_9384.jpg)
各种碰撞属性对象的碰撞消息发送标准