FindGameObjectWithTag中的NullReferenceException

时间:2015-03-02 07:18:58

标签: c# unity3d gameobject

我的场景中有一个面板(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)?

感谢您的支持。

2 个答案:

答案 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);
}

应该做的伎俩。