Unity中跨脚本引用公共变量返回旧值的解决方法
问题解决:Unity公共变量跨脚本引用返回旧值
核心原因
Unity的事件执行顺序是按钮OnClick回调先于Update方法触发。你点击按钮时,ScoreWhatBeatsWhat的CompareTwoVariables会先执行,此时OppRandomScript的Update还没运行,oppChoice还是上一次的旧值(第一次点击时就是初始默认值),之后Update才会更新变量,这就造成了“滞后一拍”的现象。
新手友好的解决办法
方案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() { // 这里只保留需要每帧监听的逻辑(如果有的话),移除随机生成代码 } }
- 在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
相关产品推荐
相关产品推荐

