Unity 2D子弹预制体无法拖拽EnemyAI对象至公共变量问题求助
问题分析与解决方案
代码逻辑错误修复
你的代码存在缩进导致的逻辑漏洞,第二个if语句未用大括号包裹EnemyHealth.TakeDamage(10),会导致无论是否碰撞敌人都会执行伤害逻辑;且子弹销毁后后续代码仍会运行,极易引发空引用异常。同时,提前绑定EnemyAI公共变量的思路不合理——子弹预制体无法预先知晓会碰撞哪个敌人,正确做法是在碰撞时动态获取目标敌人的组件。
修正后的代码:
void OnCollisionEnter2D(Collision2D coll) { print("Collided"); if (coll.gameObject.tag == "Wall") { Destroy(gameObject); } else if (coll.gameObject.tag == "Enemy") { // 从碰撞的敌人对象中获取EnemyAI组件 EnemyAI enemyHealth = coll.gameObject.GetComponent<EnemyAI>(); if(enemyHealth != null) { enemyHealth.TakeDamage(10); } Destroy(gameObject); } }
公共变量拖拽失败的排查要点
如果仍想尝试绑定公共变量(不推荐,因子弹是预制体,实例化后绑定同一敌人不符合战斗逻辑),检查以下内容:
- 确认场景中名为
EnemyAI的游戏对象确实挂载了EnemyAI脚本,类名与脚本文件名完全一致,无拼写错误。 - 确保是给场景中的子弹实例赋值,而非Project面板里的预制体——预制体无法直接绑定场景内对象,需先将预制体拖入场景赋值,再覆盖回预制体。
- 检查变量类型匹配:
public EnemyAI EnemyHealth;中的EnemyAI必须是目标脚本的类名,无命名空间冲突问题。
内容的提问来源于stack exchange,提问作者Liam Parcel
相关产品推荐
相关产品推荐

