unity3D OnTriggerEnter和OnCollisionEnter的一点个人心得(主要讲区别)

本文详细对比了Unity中OnTriggerEnter与OnCollisionEnter两种碰撞检测方法的区别,并通过具体实验阐述了这两种方法的应用场景及技巧,包括刚体(Rigidbody)的使用、碰撞效果的实现等。

觉得这个讲的挺好的,就转过来了:)

太抽象的理论总是让人眼花缭乱,所以我这里以例证为主。

1,测试OnTriggerEnter和OnCollisionEnter的区别

测试:如果两个物体A,B 

两者都有碰撞体collider(Box Collider,Sphere Collider,Capsule Collider等)

A,B都有刚体(Rigidbody)

A或者B中有一个勾选isTrigger或者两者都勾选isTrigger A和B都可以进入OnTriggerEnter方法,但是不可进入OnCollisionEnter方法。

A和B都不勾选isTrigger,A和B能进入OnCollisionEnter方法但是不能进入OnTriggerEnter方法。

结论:

OnCollisionEnter方法必须是在两个碰撞物体都不勾选isTrigger的前提下才能进入,反之只要勾选一个isTrigger那么就能进入OnTriggerEnter方法。

OnCollisionEnter和OnTriggerEnter是冲突的不能同时存在的。

2,OnTriggerEnter和OnCollisionEnter的选择。

如果想实现两个刚体物理的实际碰撞效果时候用OnCollisionEnter,Unity引擎会自动处理刚体碰撞的效果。

如果想在两个物体碰撞后自己处理碰撞事件用OnTriggerEnter。

3,一些技巧。

3.1:刚体(Rigidbody)的使用。

     两个碰撞的物体A 和 B

     现在我们就可以分两种模式来分析了,就是OnTrigger模式和OnCollision模式,因为上面已经详细介绍了两者是对立的模式, 

     在OnCollision模式下:

     测试1:如果只有A有刚体(Rigidbody),那么当A去碰撞B时,发现A弹开B没有动。A和B都进入OnCollisionEnter方法

     结论1:只有刚体能实现真实的物理碰撞。

     测试2:如果只有A有刚体(Rigidbody),那么当B去碰撞A时,发现没有碰撞效果,A和B都没有进入OnCollisionEnter方法。

     结论2:实现碰撞的条件是,发起碰撞方必须具有刚体。

     这里我猜测了刚体是用来实现物理真实碰撞的Component,但是这个想法是错误的,因为OnTriggerEnter也必须有一个物体具有刚体,所以猜测刚体应该是一个判断是否实现碰撞的是与否的标志。

     在OnTrigger模式下:

     A和B必须有一个有刚体(Rigidbody),A和B都可以进入OnTriggerEnter方法。

4,知识扩展。

上面的内容中有的实验是A,B有一个有刚体,有的实验是A,B都有刚体,那么为什么不干脆把两个物体都加刚体就没这么多麻烦了?

其实是这样的,真实游戏里面,有太多的物体,而这些物体如果都有刚体那么对系统的开销是很大的,如果可以减少一半的开销是很不错的选择。

比如地面就可以不设置刚体,因为地面是永远不动的,把人物设置刚体就可以实现真实的物理碰撞效果了。

来自地址:http://hi.baidu.com/dajiangfengdu2/item/8dec48c008ebf823e80f2e38

`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` 相对更稳定,仅在进入离开触发区域时才会改变触发状态。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值