NullReferenceException в 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: ссылка на объект не установлена на экземпляр объекта) в строке: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 ответа
Это просто означает, что:
GameObject ErrorMessage = GameObject.FindGameObjectWithTag("ErrorMessage");
не находит игровой объект.
Возможно, потому что вы на самом деле не поместили тег в GameObject или тег написан неправильно. И обязательно помните, что слои не являются тегами!
Хотя на самом деле, я не знаю всей вашей установки, но я подозреваю, что вы делаете, вы действительно не должны делать. Создание тега для диалога errorMessage? Я написал много интерфейсов в Unity. Никогда я ничего не помечал в пользовательском интерфейсе. Маркировка должна использоваться для очень общей группировки типов объектов в сцене, которые вам нужно легко захватить как группу. TeamA, TeamB, AI, powerup. Он не должен использоваться для захвата только одного объекта, очень специфического характера.
Я хотел бы использовать GameObject.Find и искать его по имени самого GameObject.
Или я бы сделал то, что сказал Мирон Алекс, и создал бы слот в инспекторе, а затем перетащил в него GameObject. Который в идеале должен быть сериализованной частной переменной.
[SerializeField]
private GameObject errorMessage;
NullReferenceException генерируется, когда объект имеет значение "ноль", как и в случае, если он не существует. В вашем коде метод
GameObject.FindGameObjectWithTag("ErrorMessage");
не найдено ни одного объекта с тегом "ErrorMessage", что означает, что он вернул "null" и присвоил "null" объекту ErrorMessage GameObject. Когда вы пытаетесь вызвать метод для "нулевого" объекта, он выдаст "NullReferenceException", потому что "нулевое" значение ничего не знает о методе "SetActive(bool value)" (как это делает GameObject).
Убедитесь, что у вас есть объект, помеченный как "errorMessage" в сцене. Чтобы сделать это проще, сделайте публичный GameObject в своем коде, назовите его ErrorMessage и назначьте его в инспекторе.
public GameObject errorMessage;
if(getUsernameResponse == "Login OK")
{
Application.LoadLevel("LobbyUI");
}
else
{
errorMessage.SetActive(false);
}
Должен сделать свое дело.