我的场景中有一个面板(ErrorMessage),我在编辑器中禁用了它并在我的C#脚本中写了这个:
if(getUsernameResponse == "Login OK") {
Application.LoadLevel("LobbyUI");
} else {
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
ErrorMessage.SetActive(true);
}
如果ErrorMessage
具有不同的“Login OK”响应,脚本应启用(显示)我的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)?
感谢您的支持。
答案 0 :(得分:3)
它只是意味着:
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
找不到游戏对象。
可能是因为您实际上没有在GameObject上放置标记,或者标记拼写错误。并且一定要记住图层不是标签!
真的,我不知道你的整个设置,但我怀疑你做的事情,你真的不应该这样做。为errorMessage对话创建标记?我在Unity中编写过很多用户界面。永远不会在UI中标记任何内容。标记应该用于场景中对象类型的非常通用的分组,您需要轻松地将其作为一组进行抓取。 TeamA,TeamB,AI,通电。它不应该用于抓取一个非常具体的物体。
我会使用GameObject.Find并按实际GameObject的名称搜索它。
或者我会做Miron Alex所说的并在检查器中创建一个槽,然后将GameObject拖入其中。理想情况下,应该是序列化的私有变量。
[SerializeField]
private GameObject errorMessage;
答案 1 :(得分:1)
当对象是" null"时抛出NullReferenceException。如在,它不存在。 在您的代码中,方法
GameObject.FindGameObjectWithTag("ErrorMessage");
没有使用" ErrorMessage"找到任何对象tag,表示它返回" 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);
}
应该做的伎俩。