Unity中如何将一个UI Text的内容正确赋值给另一个UI Text控件
Unity关卡结算时间同步解决方案
错误原因
- 原EndScreenScript中
endScreenTime = TimerScript.timerText的逻辑是替换了结算界面Text控件的引用,不是把时间文本赋值给结算界面的Text控件,完全无法实现内容同步 - Awake生命周期只会在脚本实例化时执行一次,若结算界面初始为隐藏状态,Awake早就执行完毕,等界面启用时无法获取最新的时间数据
代码修改
1. TimerScript修改
新增公开方法获取最终格式化后的时间字符串,也可按需添加停止计时的逻辑避免关卡结束后时间继续走动:
public class TimerScript : MonoBehaviour { public Text timerText; private float startTime; private bool isTiming = true; // 新增计时状态标记 void Start() { startTime = Time.time; } public void Update() { if (!isTiming) return; // 停止计时后不再更新 float t = Time.time - startTime; string minutes = ((int)t / 60).ToString(); string seconds = (t % 60).ToString("f2"); timerText.text = minutes + ":" + seconds; } // 新增公开方法,返回格式化后的最终时间 public string GetFinalTime() { float t = Time.time - startTime; string minutes = ((int)t / 60).ToString(); string seconds = (t % 60).ToString("f2"); return minutes + ":" + seconds; } // 可选:关卡结束时调用该方法停止计时 public void StopTimer() { isTiming = false; } }
2. EndScreenScript修改
将Awake逻辑替换为OnEnable生命周期,每次界面启用时主动拉取最新时间赋值给结算界面的Text控件:
public class EndScreenScript : MonoBehaviour { public Text endScreenTime; public TimerScript timerScript; void OnEnable() { // 直接把获取到的格式化时间赋值给结算界面Text的text属性 endScreenTime.text = timerScript.GetFinalTime(); } }
注意事项
- 在Inspector面板中确保EndScreenScript的
timerScript字段已经正确拖入场景中挂载了TimerScript的对象 - 关卡完成时先调用
StopTimer()方法可避免结算界面显示后时间继续走动,再调用结算界面的SetActive(true)即可自动触发OnEnable逻辑刷新时间显示
内容的提问来源于stack exchange,提问作者LBbrowns
相关产品推荐
相关产品推荐

