Unity物理系统中碰撞体、刚体、isKinematic、isTrigger的关系(附动画演示)

发布于:2022-12-20 ⋅ 阅读:(1193) ⋅ 点赞:(0)

写在前面

看了网上一些关于碰撞和刚体的讲解,自己再做了一下实验,这里总结一下。

产生碰撞的条件

条件:两个物体都有碰撞体+至少有个物体有刚体。
注意
(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+刚体+取消重力)

结果:与实验七一样、两个物体不产生碰撞,两个物体都调用触发检测方法、不调用碰撞检测方法。

写在后面

“纸上得来终觉浅,绝知此事要躬行”——出自《冬夜读书示子聿》,作者陆游。
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看