OnCollisionEnter和OnTriggerEnter 区别

本文详细解析了Unity3D中OnCollisionEnter和OnTriggerEnter两个方法的触发条件。OnCollisionEnter要求碰撞双方都是碰撞体,且刚体不为IsKinematic,不勾选IsTrigger。而OnTriggerEnter则需要一方碰撞体勾选IsTrigger,刚体的IsKinematic选项不做要求。这两个方法的形参对象均为未携带相应脚本的一方。

OnCollisionEnter方法触发条件

  1. 碰撞双方必须是碰撞体(Conllision)
  2. 碰撞的主动方必须是刚体(Rigidbody)
  3. 刚体不能勾选IsKinematic
  4. 碰撞体不能勾选IsTrigger

注意:OnCollisionEnter方法的形参对象指的是碰撞双方中没有携带OnCollisionEnter方法的一方


OnTriggerEnter方法触发条件

  1. 碰撞双方必须是碰撞体(Conllision)
  2. 碰撞双方其中一个碰撞体必须勾选IsTrigger选项
  3. 碰撞双方其中一个方必须是刚体(Rigidbody)
  4. 刚体的IsKinematic选项可以勾选也可以不勾选

注意:只要满足上面两个条件,不管是谁主动都会触发



总结:

相同点:
1 碰撞双方都必须是碰撞体
2 都要有刚体参与
3 形参对象均表示没有携带OnCollisionEnter或OnTriggerEnter脚本的一方

不同点:
1 OnTriggerEnter要求碰撞体的任意一方必须勾选IsTigger选项,OnCollisionEnter则要求全不勾选
2 OnTriggerEnter对刚体的IsKinematic项没有要求,OnCollisionEnter则要求不能勾选
3 OnTriggerEnter对刚体挂在碰撞双方的哪一方没有要求,而OnCollisionEnter则要求挂在碰撞的主动方

文章转自https://blog.youkuaiyun.com/qq_15267341/article/details/53489957

`OnTriggerEnter` `OnCollisionEnter` 触发频率的差异主要体现在以下方面: ### 触发时机与频率本质 - **`OnTriggerEnter`**:当一个带有刚体(Rigidbody)的物体进入另一个勾选了 `Is Trigger` 属性的碰撞器(Collider)时,该方法会被调用。它仅在物体进入触发区域的那一帧触发一次。例如,玩家角色走进一个触发区域,`OnTriggerEnter` 只会在玩家进入的瞬间执行一次,之后只要玩家在该区域内移动,此方法不会再次触发,直到玩家离开该区域后再次进入才会再次触发。 ```csharp void OnTriggerEnter(Collider other) { Debug.Log("Entered trigger area"); } ``` - **`OnCollisionEnter`**:当两个带有碰撞器(Collider)刚体(Rigidbody)的物体发生碰撞时,该方法会被调用。其触发频率与物体的运动状态碰撞情况有关。如果两个物体持续处于碰撞状态(例如,一个物体不断挤压另一个物体),`OnCollisionEnter` 也只会在碰撞开始的那一帧触发一次。然而,在复杂的物理场景中,由于物体的运动受力情况多变,可能会出现短暂分离后又再次碰撞的情况,从而多次触发该方法。 ```csharp void OnCollisionEnter(Collision collision) { Debug.Log("Collision occurred"); } ``` ### 影响触发频率的因素 - **物体运动速度**:物体运动速度越快,在某些情况下可能会导致 `OnCollisionEnter` 触发频率增加。例如,一个高速运动的物体可能会在短时间内多次与其他物体发生碰撞,从而多次触发 `OnCollisionEnter`。而 `OnTriggerEnter` 不受物体在触发区域内运动速度的影响,只要不离开再进入,就不会再次触发。 - **物理模拟精度**:Unity 的物理模拟精度设置会影响碰撞检测的准确性频率。在高精度设置下,碰撞检测会更频繁,可能会使 `OnCollisionEnter` 有更多机会被触发,尤其是在物体之间的微小接触或复杂碰撞场景中。而 `OnTriggerEnter` 主要依赖于物体是否进入或离开触发区域,受物理模拟精度的影响相对较小。 ### 与 `FixedUpdate` 的关系 `FixedUpdate` 与物理系统紧密集成,是进行物理相关操作的理想位置 [^3]。`OnTriggerEnter` `OnCollisionEnter` 的触发与 `FixedUpdate` 中的物理模拟有关。物理模拟在 `FixedUpdate` 中进行,当物理模拟检测到满足触发条件时,会在相应的帧调用 `OnTriggerEnter` 或 `OnCollisionEnter`。但它们本身不是在 `FixedUpdate` 中循环调用,而是在满足特定条件时触发。 ### 总结 `OnTriggerEnter` `OnCollisionEnter` 通常都在满足条件的那一帧触发一次。不过,在复杂物理场景中,`OnCollisionEnter` 由于物体的运动碰撞情况多变,可能会有更多的触发机会,而 `OnTriggerEnter` 相对更稳定,仅在进入离开触发区域时才会改变触发状态。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值