惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
P
Proofpoint News Feed
D
DataBreaches.Net
C
Check Point Blog
L
LangChain Blog
量子位
美团技术团队
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
N
Netflix TechBlog - Medium
V
Visual Studio Blog
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42
腾讯CDC
M
MIT News - Artificial intelligence
Microsoft Azure Blog
Microsoft Azure Blog
Blog — PlanetScale
Blog — PlanetScale

博客园 - 华安

自适应网格系统:CSS Grid中repeat()、auto-fill与auto-fit的深度解析 CSS3中响应式布局两大神器display:flex和display:grid springBoot中的 pom.xml文件 bulid学习 CSS中元素的display显示方式有多种,隐藏、块级、内联、内联-块级 SQl Server 中的 go 是什么作用 CSS中 display:flex的align-items: stretch; 移动端浏览器(尤其是 iOS Safari)的橡皮筋回弹效果(Overscroll / Bounce Effect) 手机端浏览器上ES6中的Fetch回调执行 window.open没效果 用Flex实现兼容性好的全屏布局 在 VS Code 中使用 C# Dev Kit 和 Unity Tools 调试 Unity 2022 Unity 可编程物件(ScriptableObject) 微信小程序中的 联系客服 最基本的使用方法 wx.requestSubscribeMessage(Object object) 和 wx.requestSubscribeDeviceMessage(Object object) 这两个有什么区别 微信小程序中 wx.hideLoading() 后调用 wx.showToast()的问题 Windows 中启动 Nginx的常用命令 CSS进阶技巧:字体渐变、描边、倒影与渐变色描边全解析 netCore 中各DLL引用了 SkiaSharp.dll的问题 unity中预制体解包 在 Unity 中,Time.timeScale实现游戏暂停加速等 微信小程序中关联微信支付 unity中的 Navigation AI使用 C#中TaskCompletionSource(简称 TCS)学习 Unity 编辑器 中,快捷键 Ctrl + Shift + F 的功能 unity中按下 F键,让物体聚焦 微信中进入定页面的,判断时通过扫二维码进入的,还是点小程序名称进入的 MYSQL中从JSON字符串中提取指定的值 Unity2022中创建动画 Animation(旧方法) Unity 中区别,public 和 [SerializeField] asp.netCore中给动态请求路径加客户端缓存 netCore中获取客户端真实的IP引起的思考
Unity中 onCollisionEnter2D与OnTriggerEnter2D 区别
华安 · 2026-07-25 · via 博客园 - 华安

在 Unity 2D 中,OnCollisionEnter2DOnTriggerEnter2D 是两种不同的碰撞检测回调方法,它们的主要区别在于物理响应和触发条件。

核心区别

1. 物理碰撞 vs 触发检测

特性OnCollisionEnter2DOnTriggerEnter2D
物理效果 ✅ 有物理碰撞(反弹、摩擦等) ❌ 无物理碰撞(直接穿透)
碰撞体类型 必须勾选 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);
        }
    }
}

配置要求

碰撞检测条件

要触发回调,两个物体必须满足:

  1. 两者都有 Collider2D(碰撞体组件)
  2. 至少一个刚体(Rigidbody2D,可以是 Kinematic)

不同组合的行为

物体A物体B结果
普通碰撞体 普通碰撞体 ✅ 触发 OnCollisionEnter2D + 物理效果
触发器 普通碰撞体 ✅ 触发 OnTriggerEnter2D
触发器 触发器 ✅ 触发 OnTriggerEnter2D
普通碰撞体 普通碰撞体(无Rigidbody) ❌ 不触发任何回调

性能考虑

  • OnTriggerEnter2D 通常更高效,因为不需要计算物理碰撞响应
  • OnCollisionEnter2D 需要额外处理物理计算(摩擦力、弹性系数等)
  • 大量触发器比大量碰撞体性能更好

选择建议

  • 需要物理效果(反弹、摩擦、力)→ 使用 OnCollisionEnter2D
  • 仅需要检测(进入区域、收集物品)→ 使用 OnTriggerEnter2D
  • 不确定时,优先使用触发器,因为性能更好且更容易控制

记住:Trigger 让物体像幽灵一样穿过,Collision 让物体像实体一样碰撞。