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

