修复Unity Flappy Bird鸟死后涨分bug:两种方案的生效疑问
你的第二种方案完全无法加分的核心问题是:PipeMiddleScript里的birdScript变量没有被初始化,始终为null。
具体分析
在生效的第一种方案里,你在PipeMiddleScript的Start()方法中通过GameObject.FindGameObjectWithTag("Logic")主动获取了LogicManager的引用,所以logic变量能正常使用。但第二种方案里,你只在代码里声明了public BirdScript birdScript;,既没有在Unity编辑器的Inspector面板中手动拖拽Bird对象到这个引用框,也没有在代码里通过查找逻辑获取Bird的组件实例,导致birdScript一直是null。
当触发管道的OnTriggerEnter2D时,判断条件birdScript.birdIsAlive == true会因为birdScript是null而永远不成立(甚至会在Console面板报空引用错误),自然不会执行加分逻辑。
修复方法
你可以通过以下两种方式解决引用问题:
方法1:代码自动查找(无需手动拖拽)
先给你的Bird对象设置一个专属Tag(比如Bird),然后修改PipeMiddleScript的Start()方法,添加查找逻辑:
void Start() { logic = GameObject.FindGameObjectWithTag("Logic").GetComponent<LogicManager>(); // 新增:查找Bird对象并获取BirdScript组件 birdScript = GameObject.FindGameObjectWithTag("Bird").GetComponent<BirdScript>(); }
方法2:编辑器手动赋值
在Unity编辑器中:
- 选中带有
PipeMiddleScript的管道对象 - 在Inspector面板找到
Pipe Middle Script组件 - 将场景中的Bird对象拖拽到
birdScript的引用输入框中
额外注意事项
修复引用后,还要留意Unity的脚本执行顺序:如果鸟碰撞死亡时birdIsAlive = false的执行时机晚于触发加分的逻辑,可能还是会出现死后加分的情况。你可以在Edit > Project Settings > Script Execution Order里调整脚本的执行顺序,让BirdScript的执行优先级高于PipeMiddleScript,确保死亡状态先被更新。
内容的提问来源于stack exchange,提问作者display name here

