FindGameObjectWithTag 中的 NullReferenceException

Mir*_*bin 1 c# unity-game-engine gameobject

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

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

ErrorMessage如果有不同的“登录正常”响应,脚本应该启用(显示)我的getUsernameResponse。但是当我启动 liveDemo 时,我看到此错误:

NullReferenceException:行中的对象引用未设置为对象的实例:41 (ErrorMessage.SetActive(true);)

我尝试ErrorMessage从编辑器启用并禁用

if(getUsernameResponse == "Login OK") {
                Application.LoadLevel("LobbyUI");
            } else {
                GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
                ErrorMessage.SetActive(false);
            }
Run Code Online (Sandbox Code Playgroud)

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

感谢你的支持。

ryg*_*go6 5

它的意思很简单:

GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
Run Code Online (Sandbox Code Playgroud)

没有找到游戏对象。

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

说实话,我不知道你的整个设置,但我怀疑无论你做什么,你真的不应该做。为 errorMessage 对话创建标签?我用 Unity 编写了很多 UI。永远不要在 UI 中标记任何内容。标记应用于场景中需要轻松抓取的对象类型的非常通用的分组。A 队、B 队、AI、通电。它不应该用于仅抓取一个具有非常特定性质的物体。

我将使用 GameObject.Find 并按实际 GameObject 的名称搜索它。

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

[SerializeField]
private GameObject errorMessage;
Run Code Online (Sandbox Code Playgroud)