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

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不生效:

  1. 修复KeepingScore的静态方法问题
    Unity的内置触发生命周期方法OnTriggerEnter2D不能声明为static,加了静态修饰符后Unity不会自动调用该方法,你的得分逻辑根本不会执行。直接去掉方法前的static关键字即可。
  2. 合并触发逻辑避免执行顺序错误
    你同时将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:24:03