Unity中 onCollisionEnter2D与OnTriggerEnter2D 区别
在 Unity 2D 中,OnCollisionEnter2D 和 OnTriggerEnter2D 是两种不同的碰撞检测回调方法,它们的主要区别在于物理响应和触发条件。
核心区别
1. 物理碰撞 vs 触发检测
| 特性 | OnCollisionEnter2D | OnTriggerEnter2D |
|---|---|---|
| 物理效果 | ✅ 有物理碰撞(反弹、摩擦等) | ❌ 无物理碰撞(直接穿透) |
| 碰撞体类型 | 必须勾选 Is Trigger = false |
必须勾选 Is Trigger = true |
| 相互穿透 | 不会穿透,会被推开 | 可以穿透(无物理阻挡) |
| 适用场景 | 物理碰撞、物体互动 | 区域检测、事件触发 |
2. 回调参数类型
// 物理碰撞 - 提供碰撞详细信息 void OnCollisionEnter2D(Collision2D collision) { // 可以获取碰撞点、法线、相对速度等物理信息 Vector2 contactPoint = collision.contacts[0].point; float impactForce = collision.relativeVelocity.magnitude; } // 触发器 - 仅提供碰撞体引用 void OnTriggerEnter2D(Collider2D other) { // 只能获取进入触发器的碰撞体,无物理细节 // 常用于检测是否进入某个区域 }
实际应用场景
OnCollisionEnter2D 适用场景
- 物理碰撞效果:球撞墙反弹、角色踩到平台
- 需要碰撞力信息:计算伤害、破坏效果
- 物体推动:推箱子、打飞物体
OnTriggerEnter2D 适用场景
- 区域检测:进入伤害区域、收集宝物
- 门/开关:角色靠近自动开门
- 隐形墙壁:限制玩家移动但不显示碰撞
- 检测范围:敌人巡逻范围、警戒区
代码示例对比
// 物理碰撞示例 public class Player : MonoBehaviour { void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.CompareTag("Enemy")) { // 根据碰撞力度计算伤害 float damage = collision.relativeVelocity.magnitude * 10; HP -= damage; } } } // 触发器示例 public class Coin : MonoBehaviour { void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Player")) { // 拾取金币,无需物理效果 ScoreManager.AddCoin(1); Destroy(gameObject); } } }
配置要求
碰撞检测条件
要触发回调,两个物体必须满足:
- 两者都有 Collider2D(碰撞体组件)
- 至少一个刚体(Rigidbody2D,可以是 Kinematic)
不同组合的行为
| 物体A | 物体B | 结果 |
|---|---|---|
| 普通碰撞体 | 普通碰撞体 | ✅ 触发 OnCollisionEnter2D + 物理效果 |
| 触发器 | 普通碰撞体 | ✅ 触发 OnTriggerEnter2D |
| 触发器 | 触发器 | ✅ 触发 OnTriggerEnter2D |
| 普通碰撞体 | 普通碰撞体(无Rigidbody) | ❌ 不触发任何回调 |
性能考虑
- OnTriggerEnter2D 通常更高效,因为不需要计算物理碰撞响应
- OnCollisionEnter2D 需要额外处理物理计算(摩擦力、弹性系数等)
- 大量触发器比大量碰撞体性能更好
选择建议
- 需要物理效果(反弹、摩擦、力)→ 使用
OnCollisionEnter2D - 仅需要检测(进入区域、收集物品)→ 使用
OnTriggerEnter2D - 不确定时,优先使用触发器,因为性能更好且更容易控制
记住:Trigger 让物体像幽灵一样穿过,Collision 让物体像实体一样碰撞。
浙公网安备 33010602011771号