Unity问题:从不同脚本调用同一方法返回结果不一致
问题分析与解决方案
核心问题
你犯了一个典型的组件引用错误:
在FoodSpawner_Script的Awake()方法中,你获取的是食物预制体上的FoodTrigger_Script组件,而非游戏运行时通过Instantiate()生成的实际食物实例的组件。预制体的eaten字段始终是默认的false,所以不管游戏里的食物有没有被蛇头触发,你读取的都是预制体的状态,自然永远输出false。
修复方案
修改FoodSpawner_Script的代码,确保每次生成食物后,引用的是当前实例化食物的FoodTrigger_Script组件:
- 删除
Awake()方法中获取预制体组件的代码 - 在
SpawnFood()方法里,实例化食物后从tempFood上获取组件并赋值给foodTrigger - 增加空引用判断,避免运行时报错
- 补充食物被吃掉后的销毁与重生逻辑
修改后的完整代码
public class FoodSpawner_Script : MonoBehaviour { [SerializeField] GameObject snakeHead; private GameObject tempFood; FoodTrigger_Script foodTrigger; [SerializeField] GameObject foodPrefab; void Start() { SpawnFood(); } void Update() { ProcessFood(); } void SpawnFood() { tempFood = Instantiate(foodPrefab, new Vector3(Random.Range(-8,8), Random.Range(-4, 4),0), transform.rotation); // 从实例化的食物对象上获取组件 foodTrigger = tempFood.GetComponent<FoodTrigger_Script>(); } void ProcessFood () { if(foodTrigger != null) { bool isEaten = foodTrigger.GetTriggerCondition(); Debug.Log(isEaten); if(isEaten) { Destroy(tempFood); SpawnFood(); } } } }
额外优化建议
可以取消Update()里的轮询逻辑,改为在食物触发时直接通知生成器,提升性能:
- 在
FoodTrigger_Script中添加生成器引用:
[SerializeField] FoodSpawner_Script spawner; private void SetTriggerTrue() { eaten = true; Debug.Log("TRUEEEE"); spawner.SpawnNewFood(); }
- 在生成器中新增方法:
public void SpawnNewFood() { Destroy(tempFood); SpawnFood(); }
内容的提问来源于stack exchange,提问作者Lukavich
相关产品推荐
相关产品推荐

