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

Unity C#开发问题:敌人存活时子弹自爆 仅死亡后可正常发射

问题原因
  • 子弹的OnTriggerEnter2D触发逻辑没有做碰撞对象过滤,只要碰到任意带有碰撞体的物体就会直接触发爆炸、销毁子弹,包含发射它的敌人自身。
  • 敌人存活时自身的Collider2D处于启用状态,子弹的生成初始位置刚好在敌人碰撞体的范围内,刚生成就触发了和敌人的碰撞,因此会在敌人位置直接爆炸,无法正常发射。
  • 敌人死亡时会执行Die方法,将自身的Collider2D禁用,此时子弹生成后不会和敌人的碰撞体触发检测,因此可以正常向玩家飞行,表现符合预期。
解决方法

有多种方案可选,任选其一即可:

方案1:碰撞层过滤

  • 给敌人和子弹分别分配独立的物理层,比如敌人放在「Enemy」层,子弹放在「EnemyBullet」层。
  • 打开Unity的Edit > Project Settings > Physics 2D设置,找到碰撞矩阵,取消勾选「Enemy」层和「EnemyBullet」层的交互,从物理层面禁止两者触发碰撞检测。

方案2:代码逻辑过滤

在子弹的OnTriggerEnter2D开头加入判断,过滤掉敌人的碰撞体,修改后代码如下:

void OnTriggerEnter2D(Collider2D hitInfo)
{
    // 碰撞到敌人则直接跳过后续逻辑
    if(hitInfo.CompareTag("Enemy"))
    {
        return;
    }
    GameObject effect = Instantiate(hitEffect, transform.position, Quaternion.identity);
    Destroy(effect, 2f);
    Player player = hitInfo.GetComponent<Player>();
    if(player != null)
    {
        player.TakeDamage(damage);
    }
    Destroy(gameObject);
}

注:原代码中重复调用了两次Destroy(gameObject),可删除冗余的一次。

补充优化

你也可以调整子弹生成的初始位置,让子弹生成时就处于敌人碰撞体的范围外,从根源避免触发自身碰撞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:45:07