本人学生一枚,初学unity若有理解的不对的地方,希望大家多多指教,不胜感激。
同样是在学习过程中遇到关于碰撞器的小问题,查阅相关的材料后,对于碰撞检测的原理有了一定了解,整理相关笔记,与大家分享。
unity中的两个物体要想发生碰撞,必须依赖于自身的碰撞器组件(Collider),并且至少其中一个物体必须附有刚体组件(Rigidbody),其中附带碰撞检测脚本的物体必须有刚体组件。
unity中的碰撞检测,主要有两种接口函数,一种是碰撞信息检测,一种是触发信息检测(在检视面板碰撞器组件中勾选IsTrigger属性选择框,则为触发器模式),这两种接口函数具体为:
碰撞信息检测:
1.MonoBehaviour.OnCollisionEnter(Collision collisionInfo) 只有进入碰撞器时,调用该方法,在两个物体离开碰撞器之前只调用一次
2.MonoBehaviour.OnCollisionStay(Collision collisionInfo) 在两物体保持接触时调用,在两个物体碰撞器离开之前每帧调用一次
3.MonoBehaviour.OnCollisionExit(Collision collisionInfo) 只有两个物体碰撞器离开时,调用该方法一次
触发信息检测:
1.MonoBehaviour.OnTriggerEnter(Collider colliderInfo) 只有进入触发器时,调用该方法,在两个物体离开触发器之前只调用一次
2.MonoBehaviour.OnTriggerStay(Collider colliderInfo) 在两物体保持接触时调用,在两个物体触发器离开之前每帧调用一次
3.MonoBehaviour.OnTriggerExit(Collider colliderInfo) 只有两个物体触发器离开时,调用该方法一次
以上的接口函数都是MonoBehaviour的函数,由于我们新建的脚本都继承这个MonoBehaviour这个类。所以我们的脚本里面可以直接写这些函数。
需要注意的是这两类函数中的参数类型是不一样的,在碰撞信息检测中,所传递进来的参数是Collision类型,而在触发信息检测中,所传递进来的参数是Collider类型
那么这两种模式下的碰撞检测有什么区别呢?区别是这样的:
在使用碰撞器类型检测时,两个物体是不能进入相互内部的,并且两个物体的碰撞器接触时,在附有刚体组件的物体是会受到力的反馈作用的;
而在使用触发器类型检测时,这时候两个物体是可以进入内部的,附有刚体组件的物体并不会受到力的反馈作用,这样一来,如果我们需要检测两个物体是否有接触,同时又不希望他们产生力的影响,就可以使用触发器检测来监测两个物体是否有接触了。