前言
在学习了刚体组件后,我们看到了物体的物理效果,比如重力,碰撞等等,那么该如何检测他们之间的碰撞呢?
在Unity中,有碰撞检测和触发检测两种类型,他们的简单概括如下:
一、碰撞检测
1.如何使用碰撞检测
在3D物体上,添加刚体组件,即可实现该物体的碰撞,但地面,障碍物等往往不需要添加刚体就可以与你的对象发生碰撞,为什么不直接将所有物体都加上刚体组件呢,是为了减少计算机的开销,这样只需要设置一半的刚体组件就可以实现碰撞检测。
刚体碰撞可以模拟一定的物理效果,比如速度快的时候可以撞飞起来等等,但是无论撞什么那碰撞的一瞬间都会有物理效果,会对当前速度造成一定损失。
碰撞检测的条件:
- 发生碰撞的两个物体至少有一个带有刚体组件。
- 发生碰撞的两个物体都必须带有碰撞器组件。
- 持续碰撞的回调方法需要有相对运动才有调起。
如果带有刚体的物体不发生运动,刚体会处于休眠状态,系统不会进行碰撞检测的,如果带有刚体的物体运动,刚体会一直处于活动状态,碰撞检测才会进行。
2.检测碰撞的方法
unity中检测碰撞的方法如下,enter为碰撞一瞬间时会调用的函数,stay为碰撞持续过程中会调用的函数,exit为碰撞结束的一瞬间会调用的函数。
// 碰撞开始
void OnCollisionEnter(Collision collision) {
}
// 碰撞结束
void OnCollisionExit(Collision collision) {
}
// 碰撞持续中
void OnCollisionStay(Collision collision) {
}
碰撞检测基本用于所有的物理效果模拟上,在碰撞的不同阶段去实现不同的游戏逻辑。
二、触发检测
1.如何使用触发检测
触发检测的条件:
- 两个物体都需要有碰撞器。
- 至少有一个物体是挂载刚体。
- 其中一个的box collider组件勾选Is Trigger。
触发检测和碰撞检测虽然都可以检测到两个物体是否发生接触,但是有一些区别,比如碰撞发生时,两个物体会模拟物理效果,会弹开等等,但触发发生时,运动的物体会直接穿过对方。
还有上文提到碰撞会让两个物体有物理效果,所以在设计一些吃豆豆等行为时,当游戏对象触碰到豆豆时,豆豆被销毁,但玩家还是会受到物理效果,会明显地顿一下,这并不是我们想要的结果,因为我们只要玩家在吃到豆豆时销毁豆豆并加分就可以,所以这是就需要触发检测,这样触碰到豆豆销毁他的同时,玩家角色的行动还不会受到碰撞影响。
2.触发检测的方法
触发检测的函数方法与碰撞检测基本相同,使用的参数不同,需要注意,如下所示:
// 开始接触
void OnTriggerEnter(Collider collider) {
}
// 接触结束
void OnTriggerExit(Collider collider) {
}
// 接触持续中
void OnTriggerStay(Collider collider) {
}
总结
碰撞的检测是unity中很重要的一个知识点,基本上所有的游戏都离不开碰撞的检测,无论是2D还是3D游戏,只是3D中碰撞器的设置可能比2D复杂一点。