关于unity碰撞器碰撞检测模式的学习后续

本人在初学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.最后,当需要多个快速动态物体碰撞的情况,才使用连续动态检测模式,注意要尽可能限制使用场景。

在我的上篇文章中,出现的检测不灵敏的情况,可能原因就是当我按下检测键的时候,恰好在检测的时间间隔里,才导致了那种现象的发生。可惜两年前作为练手的项目已经不在了,我现在验证不了我的猜想了。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity中,可以通过以下几种方式来检测碰撞之间的碰撞: 1. OnCollisionEnter(Collision collision):当物体碰撞开始时调用,可以获取碰撞信息。 ```csharp void OnCollisionEnter(Collision collision) { Debug.Log("Collision occurred with " + collision.gameObject.name); } ``` 2. OnCollisionStay(Collision collision):当物体持续碰撞时调用,可以获取碰撞信息。 ```csharp void OnCollisionStay(Collision collision) { Debug.Log("Collision is still occurring with " + collision.gameObject.name); } ``` 3. OnCollisionExit(Collision collision):当物体碰撞结束时调用,可以获取碰撞信息。 ```csharp void OnCollisionExit(Collision collision) { Debug.Log("Collision ended with " + collision.gameObject.name); } ``` 4. OnTriggerEnter(Collider other):当物体进入另一个物体的触发时调用,可以获取触发信息。 ```csharp void OnTriggerEnter(Collider other) { Debug.Log("Trigger entered with " + other.gameObject.name); } ``` 5. OnTriggerStay(Collider other):当物体持续进入另一个物体的触发时调用,可以获取触发信息。 ```csharp void OnTriggerStay(Collider other) { Debug.Log("Trigger is still being entered with " + other.gameObject.name); } ``` 6. OnTriggerExit(Collider other):当物体离开另一个物体的触发时调用,可以获取触发信息。 ```csharp void OnTriggerExit(Collider other) { Debug.Log("Trigger exited with " + other.gameObject.name); } ``` 以上方法都需要在物体上添加Collider组件,并且需要挂载一个脚本来处理碰撞事件。在这些方法中,可以通过参数获取碰撞或触发的信息,例如碰撞或触发所在的物体、碰撞或触发的位置等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值