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

Unity中跨脚本引用公共变量返回旧值的解决方法

问题解决:Unity公共变量跨脚本引用返回旧值

核心原因

Unity的事件执行顺序是按钮OnClick回调先于Update方法触发。你点击按钮时,ScoreWhatBeatsWhat的CompareTwoVariables会先执行,此时OppRandomScript的Update还没运行,oppChoice还是上一次的旧值(第一次点击时就是初始默认值),之后Update才会更新变量,这就造成了“滞后一拍”的现象。

新手友好的解决办法

方案1:把随机逻辑移到公共方法,调整按钮执行顺序

这是最直观的解决方式,完全不需要用到委托/事件:

  1. 改造OppRandomScript,把Update里的随机生成逻辑抽成独立的公共方法:
public class OppRandomScript : MonoBehaviour
{
    public string oppChoice;
    // 你的其他变量(比如BS引用、精灵组件等)

    // 抽离出来的随机生成方法
    public void GenerateOppChoice()
    {
        if (BS.triggerOpp)
        {
            // 生成R/P/S的随机逻辑
            int randomIndex = Random.Range(0, 3);
            oppChoice = randomIndex switch
            {
                0 => "R",
                1 => "P",
                2 => "S",
                _ => oppChoice
            };
            // 更新精灵的代码
            Debug.Log("生成的oppChoice:" + oppChoice);
        }
    }

    void Update()
    {
        // 这里只保留需要每帧监听的逻辑(如果有的话),移除随机生成代码
    }
}
  1. 在Unity编辑器里修改按钮的OnClick列表:
    • 先添加OppRandomScript的引用,选择GenerateOppChoice方法
    • 再添加ScoreWhatBeatsWhat的引用,选择CompareTwoVariables方法
    • 确保GenerateOppChoice在列表的上方,这样点击按钮时会先执行随机生成,再执行对比逻辑

方案2:在对比前强制触发一次生成

如果不想改动按钮绑定顺序,可以在对比方法里先主动调用生成逻辑:

public class ScoreWhatBeatsWhat : MonoBehaviour
{
    public OppRandomScript opp;

    public void CompareTwoVariables()
    {
        // 先强制更新一次oppChoice,确保值是最新的
        opp.GenerateOppChoice();
        // 再执行你的对比逻辑
        Debug.Log("对比时使用的oppChoice:" + opp.oppChoice);
        // ...你的对比代码
    }
}

为什么之前的尝试无效

你试过的全局变量、用其他变量存储值等方法,都没解决执行顺序的核心问题——不管怎么存,按钮回调触发时,Update里的更新逻辑还没跑,所以拿到的永远是旧值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:07:20