如何在重新启动同一场景后在 Text.UI 上显示 Debug.Log 消息?

How to display Debug.Log messages on Text.UI after restarting the same scene?

我正在用 Unity 开发一个简单的小游戏,其中 objective 是用一只漂浮的手引导球进入篮筐,每次球进入篮筐时,由于以下原因,游戏会重置一个隐藏的对撞机,篮子里有一个触发器。

我正在尝试实现的功能:

每次球进入篮筐时,text.UI 都会更新以反映您的新得分,从 0 分开始,每次扣篮得分增加 1。

问题:

如何将“Debug.Log”转换为 text.UI?

我只成功地更新了 Unity 控制台上的分数,我无法将这些事件转换为 text.UI。 text.UI 我创建的 GameObject 只显示文本“New Game”并且永远不会更新。

更新:我创建了一个新脚本来解决这个问题,但我收到了这个错误:

NullReferenceException: Object reference not set to an instance of an object ChangingText.Start () (at Assets/Scripts/ChangingText.cs:12)

过程:

1.创建游戏对象和脚本以在场景重启后保留数据。

我创建了一个脚本来在重新启动同一场景后保留分数,我只有一个场景。 我已将此脚本附加到游戏对象:“GameController”,这就是能够保持分数更新的方式。

场景名称是:

"扣篮练习"

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameControl : MonoBehaviour
{
    // Giving it a name called "Control", any other script can interact with it
    public static GameControl Control;

    public int score;

    // Called before Start()
    private void Awake()
    {
        // If there's a control already, delete this
        // If there's no control, make this the control object
        if (Control == null)
        {
            Control = this;
            DontDestroyOnLoad(gameObject); // Don't destory the object when a scene is loaded
        }
        else if (Control != this)
        {
            Destroy(gameObject);
        }
    }
}

我为了演示这一点而包含的图片:

Creating "GameController" GameObject and Script

2。在脚本中使用 scenemanager.loadscene

在篮子中创建一个隐藏的触发器对撞机 GameObject
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class RestartTrigger : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "Ball")
        {
            SceneManager.LoadScene(0);
        }
    }
}

我为了演示这一点而包含的图片:

Creating a trigger collider and restart trigger

3.创建一个 Keep score 脚本并将此组件添加到前面提到的 trigger collider

请注意,该脚本引用了我之前创建的游戏控制脚本。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KeepingScore : MonoBehaviour
{
    static void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == "Ball")
        {
            GameControl.Control.score++;
            if (GameControl.Control.score == 1)
            {
                Debug.Log("You have " + GameControl.Control.score + " point");
            }
            else if (GameControl.Control.score != 1)
            {
                Debug.Log("You have " + GameControl.Control.score + " points");
            }
        }
   
    }
}

这是我添加的另一张图片:

Creating a script to keep score and attaching it to the trigger field

4.在屏幕上创建一个 Text.UI 并创建一个新脚本来更改文本,只为出现错误

这是产生 NullReferenceException 错误的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ChangingText : MonoBehaviour
{
    public Text scoreText;

    void Start()
    {
        scoreText.text = GameControl.Control.score.ToString();
    }

}

这是另一张图片来演示:

Creating a text object

这是我制作的屏幕录像,用于展示我的场景当前的样子:

https://www.screencast.com/t/JUBsUkHuHgHC

你有什么建议吗?

谢谢

NullReferenceException 如果您的实例之一为空并且您试图修改它,则会发生 NullReferenceException,在日志错误中,它显示:

Object reference not set to an instance of an object ChangingText.Start ()

这意味着您的 scoreText 实例没有连接到任何 UI 并且它是空的。要解决这个问题,只需简单地创建文本 UI 游戏对象并将其拖到使用 ChangingText 脚本

分配的对象中的 'scoreText' 字段中