Unity物理系统中碰撞体、刚体、isKinematic、isTrigger的关系
- 写在前面
-
- 产生碰撞的条件
- 产生触发的条件
- 实验一:蓝块(碰撞体)、红块(碰撞体)
- 实验二:蓝块(碰撞体)、红块(碰撞体+刚体)
- 实验三:蓝块(碰撞体+刚体)、红块(碰撞体+刚体)
- 实验四:蓝块(碰撞体+刚体+isKinematic)、红块(碰撞体+刚体)
- 实验五:蓝块(碰撞体+刚体+isKinematic)、红块(碰撞体)
- 实验六:蓝块(碰撞体+isTrigger)、红块(碰撞体)
- 实验七:蓝块(碰撞体+isTrigger)、红块(碰撞体+刚体)
- 实验八:蓝块(碰撞体+isTrigger+刚体+取消重力)、红块(碰撞体+刚体)
- 实验九:蓝块(碰撞体+isTrigger+刚体+取消重力)、红块(碰撞体+isTrigger+刚体+取消重力)
- 写在后面
写在前面
看了网上一些关于碰撞和刚体的讲解,自己再做了一下实验,这里总结一下。
产生碰撞的条件
条件:两个物体都有碰撞体+至少有个物体有刚体。
注意:
(1)Unity中碰撞体独立于物体大小,与物体的MeshFilter大小无关。
(2)只有碰撞体才能被射线检测到,否则无法被检测。
(3)只有刚体才会有受力效果。
(3)isKinematic就有点像把刚体关了,但没完全关,因为保留了物理特性如质量,速度等等。
产生触发的条件
条件:产生碰撞的条件(两个物体都有碰撞体+至少有个物体有刚体)+两个物体至少有个有触发器
注意:
(1)碰撞检测和触发检测不能同时触发,如果是触发检测方法调用就不可能会有碰撞检测方法调用。
实验一:蓝块(碰撞体)、红块(碰撞体)
结果:无法产生碰撞
结论:两个物体都有碰撞体,无法产生碰撞。两个物体都不调用碰撞检测方法,如OnCollisionEnter、OnCollisionExit
实验二:蓝块(碰撞体)、红块(碰撞体+刚体)
结果:红块受力反弹、蓝块不动、两个物体都会调用碰撞检测方法
结论:
(1)两个物体都有碰撞体+至少有个物体有刚体才能产生碰撞
(2)只有加了刚体的一方会受到力的影响
实验三:蓝块(碰撞体+刚体)、红块(碰撞体+刚体)
结果:蓝块和蓝块都受力影响、两个物体都会调用碰撞检测方法
结论:只有加了刚体才会受到力的影响
实验四:蓝块(碰撞体+刚体+isKinematic)、红块(碰撞体+刚体)
结果:红块受力反弹、蓝块不动、两个物体都会调用碰撞检测方法
结论:
(1)isKinematic不会对碰撞和力做出反应,不受物理系统影响,但依然会对其他刚体产生物理影响(比如可以撞击其他刚体)。
(2)isKinematic只能在脚本中修改物体的Transform属性来移动。
(3)用在经常需要移动等变化物理状态的碰撞体上。一个刚体碰撞体,可以随时开启或关闭Is Kinematic选项,不会像静态碰撞体的enabled开启或关闭那样引起物理系统的问题。
实验五:蓝块(碰撞体+刚体+isKinematic)、红块(碰撞体)
结果:蓝块和红块不产生碰撞,两个物体都不调用碰撞检测方法
结论:isKinematic就有点像把刚体关了,但没完全关,因为保留了物理特性如质量,速度等等
实验六:蓝块(碰撞体+isTrigger)、红块(碰撞体)
结果:两个物体不产生碰撞,两个物体都不调用触发检测方法,如OnTriggerEnter、OnTriggerExit
、不调用碰撞检测方法。
结论:两个只有触发器没办法实现触发检测
实验七:蓝块(碰撞体+isTrigger)、红块(碰撞体+刚体)
结果:两个物体不产生碰撞,两个物体都调用触发检测方法、不调用碰撞检测方法
结论:触发条件为:两个物体都有碰撞体(也是产生碰撞的条件)+至少有个物体有刚体(也是产生碰撞的条件)+两个物体至少有个有触发器
实验八:蓝块(碰撞体+isTrigger+刚体+取消重力)、红块(碰撞体+刚体)
结果:与实验七一样、两个物体不产生碰撞,两个物体都调用触发检测方法、不调用碰撞检测方法。
实验九:蓝块(碰撞体+isTrigger+刚体+取消重力)、红块(碰撞体+isTrigger+刚体+取消重力)
结果:与实验七一样、两个物体不产生碰撞,两个物体都调用触发检测方法、不调用碰撞检测方法。
写在后面
“纸上得来终觉浅,绝知此事要躬行”——出自《冬夜读书示子聿》,作者陆游。