如何在重新启动同一场景后在 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' 字段中
我正在用 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
在篮子中创建一个隐藏的触发器对撞机 GameObjectusing 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' 字段中