首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NullReferenceException in FindGameObjectWithTag

NullReferenceException in FindGameObjectWithTag
EN

Stack Overflow用户
提问于 2015-03-02 07:18:58
回答 2查看 2.3K关注 0票数 0

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

代码语言:javascript
复制
            if(getUsernameResponse == "Login OK") {
                Application.LoadLevel("LobbyUI");
            } else {
                GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
                ErrorMessage.SetActive(true);
            }

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

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

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

代码语言:javascript
复制
if(getUsernameResponse == "Login OK") {
                Application.LoadLevel("LobbyUI");
            } else {
                GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
                ErrorMessage.SetActive(false);
            }

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

谢谢你的支持。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-02 08:35:56

它简单地意味着:

代码语言:javascript
复制
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");

就是找不到游戏对象。

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

真的,我不知道你的整个计划,但我的怀疑是无论你做什么,你真的不应该做。为errorMessage对话创建一个标记?我在“团结”中写了很多UI。在UI中从来没有i标记过任何东西。标记应该用于场景中的对象类型的非常通用的分组,您需要将这些对象作为一个组轻松地抓取。TeamA,TeamB,AI,powerup。它不应该被用来抓取一个非常特殊性质的物体。

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

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

代码语言:javascript
复制
[SerializeField]
private GameObject errorMessage;
票数 4
EN

Stack Overflow用户

发布于 2015-03-02 07:28:52

当对象为"null“时抛出NullReferenceException,就像它不存在一样。在您的代码中,方法

代码语言:javascript
复制
GameObject.FindGameObjectWithTag("ErrorMessage"); 

没有找到任何带有" ErrorMessage“标记的对象,这意味着它返回"null”并将"null“赋值给ErrorMessage GameObject。当您试图对"null“对象调用方法时,它会抛出一个"NullReferenceException”,因为"null“值不知道"SetActive(bool值)”方法(就像GameObject那样)。

确保场景中有一个标记为"errorMessage“的对象。为了使这更容易,在代码中设置一个公共GameObject,将其命名为ErrorMessage,并在检查器中分配它。

代码语言:javascript
复制
public GameObject errorMessage;

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

应该能起作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28804492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档