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

Должен сделать свое дело.

Другие вопросы по тегам