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
相关产品推荐
相关产品推荐

