using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class NewBehaviourScript : MonoBehaviour
{
public TextMeshProUGUI countText;
private int count;
void Start()
{
count = 0;
SetCountText();
}
void SetCountText()
{
countText.text = $"Score: {count}";
}
}
访问countText
会触发NullReferenceException。没有一个解决方案提供在线工作。更令人怀疑的是,事实代码是从官方统一教程中提取的。我想有人犯了个错误。
一些附加信息:它在统一ui中的样子 CountText设置
一切似乎都井井有条。
发布于 2022-02-21 20:18:42
统一提供的调试类是一个有用的工具,应该在游戏开发过程中广泛使用。
Debug.Log($"My object is {myObject}");
在设计期间使用Inspector
窗口设置一些引用。这些引用必须在进入播放模式之前设置,否则它们将是null
。可以通过将该类型的对象拖到检查器中的对象字段中来设置引用。
当尝试访问空对象的成员时,将发生空引用。
public class DisplayPlayerName : MonoBehaviour
{
public TextMeshProUGUI uiName;
public GameObject player;
void Start()
{
uiName.text = player.name; // <- whoops! NullReferenceException
}
}
在上面的示例中,如果检查器中没有设置uiName
或player
,则将引发空引用异常。这是因为我们正在访问每个对象的一个成员。我们希望将text
属性uiName设置为player的name
属性。
但是我们怎么知道是哪个游戏对象造成了问题呢?我有一百万个游戏对象,不想全部检查!
帮助缩小搜索范围的技巧
调试抛出异常的对象的名称。
if (player == null ||
uiName == null) // <- do some null checking
{
Debug.Log($"{name} has null player or ui"); // <- log the gameobjects name
return; // <- exit the function
}
// This won't throw the exception anymore because we exit the function when null is detected
//
uiName.text = player.name;
当我们以有意义的方式命名每个对象(或者至少是最重要的对象)时,记录对象名称是最有用的。
您可以将场景中的对象过滤为具有特定组件的对象。使用Hierarchy
窗口中的搜索栏,键入t:
,然后是组件的名称。t:DisplayPlayerName
。这将只显示带有该组件的对象。
希望这能为您提供一些统一调试的新工具。
https://stackoverflow.com/questions/71212966
复制相似问题