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

Unity问题:从不同脚本调用同一方法返回结果不一致

问题分析与解决方案

核心问题

你犯了一个典型的组件引用错误:
在FoodSpawner_Script的Awake()方法中,你获取的是食物预制体上的FoodTrigger_Script组件,而非游戏运行时通过Instantiate()生成的实际食物实例的组件。预制体的eaten字段始终是默认的false,所以不管游戏里的食物有没有被蛇头触发,你读取的都是预制体的状态,自然永远输出false。

修复方案

修改FoodSpawner_Script的代码,确保每次生成食物后,引用的是当前实例化食物的FoodTrigger_Script组件:

  1. 删除Awake()方法中获取预制体组件的代码
  2. 在SpawnFood()方法里,实例化食物后从tempFood上获取组件并赋值给foodTrigger
  3. 增加空引用判断,避免运行时报错
  4. 补充食物被吃掉后的销毁与重生逻辑

修改后的完整代码

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()里的轮询逻辑,改为在食物触发时直接通知生成器,提升性能:

  1. 在FoodTrigger_Script中添加生成器引用:
[SerializeField] FoodSpawner_Script spawner;

private void SetTriggerTrue()
{
    eaten = true;
    Debug.Log("TRUEEEE");
    spawner.SpawnNewFood();
}
  1. 在生成器中新增方法:
public void SpawnNewFood()
{
    Destroy(tempFood);
    SpawnFood();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:38:08