FindGameObjectWithTag 中的 NullReferenceException

NullReferenceException in FindGameObjectWithTag

我的场景中有一个面板 (ErrorMessage),我已在编辑器中将其禁用并在我的 C# 脚本中写入:

            if(getUsernameResponse == "Login OK") {
                Application.LoadLevel("LobbyUI");
            } else {
                GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
                ErrorMessage.SetActive(true);
            }

脚本应该启用(显示)我的 ErrorMessage 如果 getUsernameResponse 有不同的响应 "Login OK".. 但是当我启动 liveDemo 时我看到这个错误:

NullReferenceException: Object reference not set to an instance of an object) in row:41 (ErrorMessage.SetActive(true);)

我尝试从编辑器中启用 ErrorMessage 并使用

禁用
if(getUsernameResponse == "Login OK") {
                Application.LoadLevel("LobbyUI");
            } else {
                GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
                ErrorMessage.SetActive(false);
            }

在我的源代码中它工作正常,我如何从我的脚本中禁用 ErrorMessage (UI.Panel)?

感谢支持。

当对象 "null" 时抛出 NullReferenceException,因为它不存在。 在您的代码中,方法

GameObject.FindGameObjectWithTag("ErrorMessage"); 

没有找到任何带有"ErrorMessage"标签的对象,这意味着它返回了"null"并将"null"分配给了ErrorMessage GameObject。 当您尝试在 "null" 对象上调用方法时,它将抛出 "NullReferenceException" 因为 "null" 值对 "SetActive(bool value)" 方法一无所知(作为 GameObject确实)。

确保场景中有一个标记为 "errorMessage" 的对象。 为了使这更容易,在您的代码中创建一个 public 游戏对象,将其命名为 ErrorMessage 并在检查器中分配它。

public GameObject errorMessage;

if(getUsernameResponse == "Login OK") 
{
   Application.LoadLevel("LobbyUI");
} 
else 
{
   errorMessage.SetActive(false);
}

应该可以解决问题。

简单来说就是:

GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");

未找到游戏对象。

可能是因为您实际上并没有在游戏对象上放置标签,或者标签拼写错误。一定要记住图层不是标签!

虽然我不知道你的整个设置,但我怀疑你在做什么,你真的不应该这样做。为 errorMessage 对话创建标签?我在 Unity 中写了很多 UI。我从来没有在 UI 中标记过任何东西。标记应该用于场景中非常通用的对象类型分组,您需要将这些对象作为一个组轻松抓取。 A 队、B 队、AI、通电。它不应该只用于抓取一个非常具体的对象。

我会使用 GameObject.Find 并按实际游戏对象的名称搜索它。

或者我会按照 Miron Alex 所说的那样在检查器中创建一个插槽,然后将 GameObject 拖入其中。理想情况下应该是序列化的私有变量。

[SerializeField]
private GameObject errorMessage;