Unity同场景重启后如何将Debug.Log消息显示到Text.UI组件上
问题解决方案
第一步:修复NullReferenceException报错
报错出现在ChangingText.Start()第12行,两个常见修复路径:
- 检查
ChangingText组件的scoreText字段赋值:在Inspector面板中,将Hierarchy面板里的得分Text UI控件拖拽到scoreText属性的输入框中完成绑定。 - 若你将
ChangingText脚本直接挂载在得分Text组件所在的GameObject上,可以直接修改代码自动获取组件,避免手动绑定漏操作:
using UnityEngine; using UnityEngine.UI; // 若使用TextMeshPro组件,替换上面的引用为 using TMPro; public class ChangingText : MonoBehaviour { void Start() { Text scoreText = GetComponent<Text>(); // 若使用TextMeshPro组件,替换上一行为 TMP_Text scoreText = GetComponent<TMP_Text>(); scoreText.text = GameControl.Control.score.ToString(); } }
- 调整脚本执行顺序:打开
Edit > Project Settings > Script Execution Order,将GameControl脚本添加到列表中,拖动到默认时间线之前,保证单例初始化早于UI赋值逻辑。
第二步:修复现有代码的隐藏逻辑问题
你当前的代码还有两处问题会导致得分不更新、UI不生效:
- 修复
KeepingScore的静态方法问题
Unity的内置触发生命周期方法OnTriggerEnter2D不能声明为static,加了静态修饰符后Unity不会自动调用该方法,你的得分逻辑根本不会执行。直接去掉方法前的static关键字即可。 - 合并触发逻辑避免执行顺序错误
你同时将RestartTrigger和KeepingScore挂在同一个碰撞体上,可能出现「先重启场景、后执行加分」的顺序问题,建议合并两个脚本的逻辑:
using UnityEngine; using UnityEngine.SceneManagement; public class ScoreAndRestart : MonoBehaviour { void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("Ball")) { // 先执行加分逻辑,再重启场景 GameControl.Control.score++; if (GameControl.Control.score == 1) { Debug.Log($"You have {GameControl.Control.score} point"); } else { Debug.Log($"You have {GameControl.Control.score} points"); } SceneManager.LoadScene(0); } } }
替换原有碰撞体上的RestartTrigger和KeepingScore脚本即可。
完成以上操作后,场景重启时UI会自动读取GameControl中保存的最新得分完成更新。
内容的提问来源于stack exchange,提问作者SlipGateFox
相关产品推荐
相关产品推荐

