FindGameObjectWithTag 中的 NullReferenceException
NullReferenceException in FindGameObjectWithTag
我的场景中有一个面板 (ErrorMessage),我已在编辑器中将其禁用并在我的 C# 脚本中写入:
if(getUsernameResponse == "Login OK") {
Application.LoadLevel("LobbyUI");
} else {
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
ErrorMessage.SetActive(true);
}
脚本应该启用(显示)我的 ErrorMessage
如果 getUsernameResponse
有不同的响应 "Login OK".. 但是当我启动 liveDemo 时我看到这个错误:
NullReferenceException: Object reference not set to an instance of an object) in row:41 (ErrorMessage.SetActive(true);)
我尝试从编辑器中启用 ErrorMessage
并使用
禁用
if(getUsernameResponse == "Login OK") {
Application.LoadLevel("LobbyUI");
} else {
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
ErrorMessage.SetActive(false);
}
在我的源代码中它工作正常,我如何从我的脚本中禁用 ErrorMessage
(UI.Panel)?
感谢支持。
当对象 "null" 时抛出 NullReferenceException,因为它不存在。
在您的代码中,方法
GameObject.FindGameObjectWithTag("ErrorMessage");
没有找到任何带有"ErrorMessage"标签的对象,这意味着它返回了"null"并将"null"分配给了ErrorMessage GameObject。
当您尝试在 "null" 对象上调用方法时,它将抛出 "NullReferenceException" 因为 "null" 值对 "SetActive(bool value)" 方法一无所知(作为 GameObject确实)。
确保场景中有一个标记为 "errorMessage" 的对象。
为了使这更容易,在您的代码中创建一个 public 游戏对象,将其命名为 ErrorMessage 并在检查器中分配它。
public GameObject errorMessage;
if(getUsernameResponse == "Login OK")
{
Application.LoadLevel("LobbyUI");
}
else
{
errorMessage.SetActive(false);
}
应该可以解决问题。
简单来说就是:
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
未找到游戏对象。
可能是因为您实际上并没有在游戏对象上放置标签,或者标签拼写错误。一定要记住图层不是标签!
虽然我不知道你的整个设置,但我怀疑你在做什么,你真的不应该这样做。为 errorMessage 对话创建标签?我在 Unity 中写了很多 UI。我从来没有在 UI 中标记过任何东西。标记应该用于场景中非常通用的对象类型分组,您需要将这些对象作为一个组轻松抓取。 A 队、B 队、AI、通电。它不应该只用于抓取一个非常具体的对象。
我会使用 GameObject.Find 并按实际游戏对象的名称搜索它。
或者我会按照 Miron Alex 所说的那样在检查器中创建一个插槽,然后将 GameObject 拖入其中。理想情况下应该是序列化的私有变量。
[SerializeField]
private GameObject errorMessage;
我的场景中有一个面板 (ErrorMessage),我已在编辑器中将其禁用并在我的 C# 脚本中写入:
if(getUsernameResponse == "Login OK") {
Application.LoadLevel("LobbyUI");
} else {
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
ErrorMessage.SetActive(true);
}
脚本应该启用(显示)我的 ErrorMessage
如果 getUsernameResponse
有不同的响应 "Login OK".. 但是当我启动 liveDemo 时我看到这个错误:
NullReferenceException: Object reference not set to an instance of an object) in row:41 (ErrorMessage.SetActive(true);)
我尝试从编辑器中启用 ErrorMessage
并使用
if(getUsernameResponse == "Login OK") {
Application.LoadLevel("LobbyUI");
} else {
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
ErrorMessage.SetActive(false);
}
在我的源代码中它工作正常,我如何从我的脚本中禁用 ErrorMessage
(UI.Panel)?
感谢支持。
当对象 "null" 时抛出 NullReferenceException,因为它不存在。 在您的代码中,方法
GameObject.FindGameObjectWithTag("ErrorMessage");
没有找到任何带有"ErrorMessage"标签的对象,这意味着它返回了"null"并将"null"分配给了ErrorMessage GameObject。 当您尝试在 "null" 对象上调用方法时,它将抛出 "NullReferenceException" 因为 "null" 值对 "SetActive(bool value)" 方法一无所知(作为 GameObject确实)。
确保场景中有一个标记为 "errorMessage" 的对象。 为了使这更容易,在您的代码中创建一个 public 游戏对象,将其命名为 ErrorMessage 并在检查器中分配它。
public GameObject errorMessage;
if(getUsernameResponse == "Login OK")
{
Application.LoadLevel("LobbyUI");
}
else
{
errorMessage.SetActive(false);
}
应该可以解决问题。
简单来说就是:
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
未找到游戏对象。
可能是因为您实际上并没有在游戏对象上放置标签,或者标签拼写错误。一定要记住图层不是标签!
虽然我不知道你的整个设置,但我怀疑你在做什么,你真的不应该这样做。为 errorMessage 对话创建标签?我在 Unity 中写了很多 UI。我从来没有在 UI 中标记过任何东西。标记应该用于场景中非常通用的对象类型分组,您需要将这些对象作为一个组轻松抓取。 A 队、B 队、AI、通电。它不应该只用于抓取一个非常具体的对象。
我会使用 GameObject.Find 并按实际游戏对象的名称搜索它。
或者我会按照 Miron Alex 所说的那样在检查器中创建一个插槽,然后将 GameObject 拖入其中。理想情况下应该是序列化的私有变量。
[SerializeField]
private GameObject errorMessage;