You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D:为何两个触发器碰撞体之间会产生交互?

触发器碰撞体交互问题解答

原始问题(翻译)

我原本认为触发器碰撞体之间不会产生交互,但实际遇到了如下问题:
我有一个作为“Player”游戏对象子物体的“AttackArea”游戏对象,已将其设置为触发器,挂载的“Attacks”脚本仅包含以下代码:

public int attackStrength;

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.GetComponent<Health>() != null && collision.CompareTag("Enemy"))
    {
        Debug.Log("touched: " + collision.name);
        Health health = collision.GetComponent<Health>();
        health.ReduceHealthPoints(attackStrength);
    }
}

当该Polygon Collider 2D接触到同样设置为触发器的Circle Collider时,OnTriggerEnter2D方法被触发调用。我不清楚为何两个触发器碰撞体之间会产生交互,相关组件设置如下:

  • AttackArea:Polygon Collider 2D设为触发器,作为Player的子物体存在
  • Enemy:Circle Collider 2D设为触发器
  • Player父物体:带有Rigidbody2D组件

核心原因

在Unity 2D碰撞系统中,两个触发器碰撞体之间是可以触发OnTriggerEnter2D等事件的,触发的必要条件是:其中一个碰撞体所属的GameObject(或其父级GameObject)必须带有非静态的Rigidbody2D组件。

结合你的场景分析:

  • Player父物体带有Rigidbody2D组件,且该组件未设置为静态(静态Rigidbody2D不会参与动态碰撞检测流程)
  • AttackArea作为Player的子物体,其触发器碰撞体将继承父物体的Rigidbody2D参与碰撞检测
  • Enemy的Circle Collider 2D为触发器,当两者接触时,因为满足“一方带有有效Rigidbody2D”的条件,Unity会触发OnTriggerEnter2D事件

解决方法(若需禁止该交互)

  • 调整碰撞矩阵:打开Edit > Project Settings > Physics 2D,在Layer Collision Matrix中取消AttackArea与Enemy所在层的交互勾选
  • 脚本内过滤:在OnTriggerEnter2D中添加对碰撞体是否为触发器的判断,仅处理非触发器目标:
private void OnTriggerEnter2D(Collider2D collision)
{
    if (!collision.isTrigger && collision.GetComponent<Health>() != null && collision.CompareTag("Enemy"))
    {
        Debug.Log("touched: " + collision.name);
        Health health = collision.GetComponent<Health>();
        health.ReduceHealthPoints(attackStrength);
    }
}

内容的提问来源于stack exchange,提问作者zamcham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:31:07