【Unity3d】碰撞检测

来源:互联网 发布:数控车床编程实例初级 编辑:程序博客网 时间:2024/06/06 08:56
Unity3d碰撞器
一.碰撞发生的必要条件:
1.产生碰撞效果需要具备两个因素

a.发起碰撞的物体
b.接收碰撞的物体

2发起碰撞的物体
a.Rigidbody
b.CharacterController

3.接受碰撞的物体
a.所有的Collider

二.在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。
触发信息:
1.MonoBehaviour.OnTriggerEnter( Collider other )当进入触发器
2.MonoBehaviour.OnTriggerExit( Collider other )当退出触发器
3.MonoBehaviour.OnTriggerStay( Collider other )当逗留触发器
碰撞信息:
1.MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
2.MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
3.MonoBehaviour.OnCollisionStay( Collision collisionInfo )  当逗留碰撞器

三.举例
A物体和B物体要发生碰撞,则A和B中必须要带有Collider组件,并且A和B中至少一个物体携带Rigidbody
1.新建一个场景,添加CubeA,CubeB,Ground 三个物体,三个物体创建自Cube,默认带有BoxCollider组件
2.新建一个脚本,TestCollider,复写四个方法
OnCollisionenter,OnCollistionExit,OnTriggerEnter,OnTriggerExit,
在这几个函数中打印一些Log,注明当前进入的函数是哪个物体的哪个函数
3.给物体A和物体B挂上TestCollider脚本
4.为了方便测试,不给物体添加移动脚本了,运行游戏测试的时候,世界更改物体A或物体B的位置,使得A和B相交就行了
直接运行游戏,拖拽物体A移动到物体B处,未来发现打印任何的Log,因为A和B没有满足发生碰撞的必要条件,A和B只有Collider,
没有Rigidbody
5.为了进一步验证碰撞发生的必要条件,我们给a添加一个组件Rigidbody【默认Use Gravity打开,Is Kinematic关闭,
之前新建Ground物体就是为了防止有Rigidbody的物体往下掉落】,再次运行游戏,拖拽物体A移动到物体B,发现物体A不能够穿透物品B,
被B阻挡的效果,打印显示两个物品都进入了OnCollisionEnter和OnCollisitionStay方法
6.为什么只进入了CollisitionXX方法而没有进入OnTriggerXX方法呢,因为物体的Collider下的IsTrigger没有打勾,所以不会触发
7.现在把物体B的Is Trigger选项打勾,再次运行游戏,发现A会穿透B,且AB两个物体进入了OnTriggerXX函数。【这里有人会问,为什么只勾选物体B的
IsTrigger选项,起始勾选A,B任一个都行,或两个都勾选,但是这里勾选A的IsTrigger,物体A会直接掉落,可先把物体A的UseGravity钩去掉,勾选IsKinematic,再勾选IsTrigger】

四.总结
当Is Trigger=false时【Rigidbody 开启UseGravity,需要模拟物理碰撞】,碰撞器根据物理引擎引发碰撞,产生碰撞的物理效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时【Rigidbody,关掉UseGravity,开启IsKinematic,避免物体下落】,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。

当需要看到物理碰撞效果的时候,调用OnCollistionXX
当需要碰撞后不影响物体位置方向等,调用OnTriggerXX

1 0
原创粉丝点击