我在我的场景中有一个面板(ErrorMessage),我在编辑器中禁用了它,并在我的C#脚本中写了这个:
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并禁用
if(getUsernameResponse == "Login OK") {
Application.LoadLevel("LobbyUI");
} else {
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
ErrorMessage.SetActive(false);
}在我的源代码中,如何从脚本中禁用ErrorMessage (UI.Panel)?
谢谢你的支持。
发布于 2015-03-02 08:35:56
它简单地意味着:
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");就是找不到游戏对象。
可能是因为您实际上没有在GameObject上放置一个标签,或者标签拼写错误。一定要记住,图层不是标签!
真的,我不知道你的整个计划,但我的怀疑是无论你做什么,你真的不应该做。为errorMessage对话创建一个标记?我在“团结”中写了很多UI。在UI中从来没有i标记过任何东西。标记应该用于场景中的对象类型的非常通用的分组,您需要将这些对象作为一个组轻松地抓取。TeamA,TeamB,AI,powerup。它不应该被用来抓取一个非常特殊性质的物体。
我将使用GameObject.Find并以实际GameObject的名称搜索它。
或者,我会按照Miron说的做,在检查器中创建一个槽,然后将GameObject拖到其中。理想情况下,应该是序列化的私有变量。
[SerializeField]
private GameObject errorMessage;发布于 2015-03-02 07:28:52
当对象为"null“时抛出NullReferenceException,就像它不存在一样。在您的代码中,方法
GameObject.FindGameObjectWithTag("ErrorMessage"); 没有找到任何带有" ErrorMessage“标记的对象,这意味着它返回"null”并将"null“赋值给ErrorMessage GameObject。当您试图对"null“对象调用方法时,它会抛出一个"NullReferenceException”,因为"null“值不知道"SetActive(bool值)”方法(就像GameObject那样)。
确保场景中有一个标记为"errorMessage“的对象。为了使这更容易,在代码中设置一个公共GameObject,将其命名为ErrorMessage,并在检查器中分配它。
public GameObject errorMessage;
if(getUsernameResponse == "Login OK")
{
Application.LoadLevel("LobbyUI");
}
else
{
errorMessage.SetActive(false);
}应该能起作用。
https://stackoverflow.com/questions/28804492
复制相似问题