本人在初学unity的时候发过这样一篇文章
关于Unity 中OnTriggerStay2D方法不触发的问题
在该篇文章中,我总结了当时项目开发时遇到的一个关于碰撞器检测不灵敏的问题。当时解决这个问题之后,只觉得皆大欢喜,写下博文之后,从此对那种解决办法屡试不爽,使用大量的bool值甚至成为了我的代码风格。
时过境迁,沧海桑田,我如今到了就业的时候,就在昨天面试的过程中,HR问了我关于碰撞器的几种检测模式,并让我简单的说一下离散型检测和碰撞型检测的区别。
我当时脑子是懵懵的,但还是把我脑子里关于碰撞检测的知识都说了一遍,什么:想要两个碰撞器发生检测,必须其中一个存在刚体。碰撞检测的方法有enter,stay,exit这三种,这三种分别是进入时触发,呆在里面触发,和离开的时候触发 云云,当然把我的那篇博客作为我的项目经历说了一下。最后我比较诚实的说了下这两种方法我确实没了解到,那一刻,我感觉到了两年前学习不深入的子弹正中眉心。
言归正传,在面试之后我对于这几种的都碰撞方法进行了学习,下面简单地总结一下
Unity碰撞检测的模式主要有四种,分别是:
离散模式(Discret):检测方式是在预设好的物理间隔时间进行检测,也是一般情况下预设的检测模式,缺点显而易见,就是当需要检测的物体在高速移动的时候,可能会在预设的检测时间内通过检测器,导致错过碰撞检测。解决方法就是可以在 Project Setting—>Time 中,设置Fixed TimeStep的时间,来改变检测的间隔时间。这种解决方法的缺点就是会牺牲大量的性能,通常情况下不做考虑。
连续模式(Continuous):检测方式是让colider线性向前移动到下一帧的投影点来实现,类似于射线检测。连续模式在高速移动下的碰撞检测会比较灵敏,但是相对的缺点就是同样对于性能的消耗很大,而且检测对象只能是没有附件刚体的物体,适用的环境也很有限。
动态连续检测模式(Continuous Dynamic):是最费性能的检测方式,一般在需要多个高速物体精准碰撞的情况下才会使用。但是当物体存在角速度的时候,以上的两种连续模式都不再适用,因为他们线性移动的算法并不适用于旋转物体。
推测式连续碰撞检测(Continuous Speculative):简单的来说是通过对物体的线性和角度运动来预测未来的位置,来形成一个检测框,在框中的所有检测的点都在计算之中。推测模式适用于静态和动态的colider,比动态连续检测模式性能更优秀,同时解决了当物体存在角速度的时候,动态连续检测模式失灵的情况。最明显的缺点就是由于算法的缘故,会产生虚空碰撞的情况。
总结
1.一般情况下,使用预设的离散模式可以解决大部分问题。
2.当存在物体穿透后检测失败,或者物体有快速的角度运动时,选择推测方式,从性能上来说,这是第二优选的方式
3.当产生了虚空碰撞或者穿透现象,尝试切换到连续模式
4.最后,当需要多个快速动态物体碰撞的情况,才使用连续动态检测模式,注意要尽可能限制使用场景。
在我的上篇文章中,出现的检测不灵敏的情况,可能原因就是当我按下检测键的时候,恰好在检测的时间间隔里,才导致了那种现象的发生。可惜两年前作为练手的项目已经不在了,我现在验证不了我的猜想了。