Unity Auto Hide Panel - PullRequest
       21

Unity Auto Hide Panel

0 голосов
/ 11 июня 2018

Я создаю приложение AR с использованием Unity.

В нем есть сцены входа / регистрации, которые позволяют пользователю войти или зарегистрироваться в приложении.

Для обработки ошибок и отображения сообщений об ошибках напользователь (например, недействительный адрес электронной почты), я просто создаю панель с текстом для отображения сообщений об ошибках.На этой панели также есть кнопка для закрытия сообщения и повторного скрытия панели ошибок.

Эта панель наложена на основную панель пользовательского интерфейса с полями ввода.

Очевидно,панель ошибок должна быть скрыта при загрузке сцены и отображаться только при наличии сообщения об ошибке.

Но я не могу установить состояние этой панели на Awake () .Я получаю сообщение об ошибке NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Я установил сценарий для панели ошибок и добавил объект Panelк сценарию в инспекторе.Изображение прикреплено для справки.

Ниже приведен мой сокращенный код ( с использованием для краткости опущен).Я попытался установить его в Start () и Awake () , но оба выдают одну и ту же ошибку.Если я установил errorPanel.gameObject.SetActive ( true ); in Awake () - ошибка не выдается.Бросается только в том случае, если для него установлено значение false

public class RegisterScene : MonoBehaviour {
    public GameObject errorPanel; // Error panel

    void Awake()
    {
        errorPanel = GameObject.FindGameObjectWithTag("errorPanel"); // Error panel Tag
        Debug.Log("Error Panel: " + errorPanel); // Outputs "ErrorPanel" as named in Inspector
        errorPanel.gameObject.SetActive(false); // Have to hide on scene Awake - throws NullReferenceError here
        //errorPanel.gameObject.SetActive(true); // This works as a test case
    }

    // Register button clicked
    public void Register ()
    {
        // If error 
        showErrorPanel("You must complete all sections");
    }

    // Show error panel
    public void showErrorPanel(string errorMessage)
    {
        Debug.Log("Showing error panel");
        errorPanel.gameObject.SetActive(true); // Working - shows error panel

        // Confirmation button on error panel clicked
        hideErrorPanel();
    }

    // Hide error panel
    public void hideErrorPanel()
    {
        Debug.Log("Hiding error panel");
        errorPanel.gameObject.SetActive(false); // Working - hides error panel
    }
}

enter image description here

1 Ответ

0 голосов
/ 11 июня 2018

Если я установлю errorPanel.gameObject.SetActive(true); в Awake() - ошибки не выдаются.Он генерируется только тогда, когда для него установлено значение false.

Вероятно, что происходит:

Ваш скрипт RegisterScene присоединен к другому GameObject.Когда вызывается GameObject.FindGameObjectWithTag("errorPanel"), ваша панель возвращается.Когда вы устанавливаете его на false с помощью errorPanel.gameObject.SetActive(false), он деактивирует его.

Функция Awake будет затем вызываться для другого GameObject, к которому он присоединен, который также будет вызыватьGameObject.FindGameObjectWithTag("errorPanel") но вернется null на этот раз.Он вернет null, потому что GameObject.FindXXX функции не могут найти деактивированные объекты.Поскольку это null, вызов errorPanel.gameObject.SetActive вызовет это исключение.

У вас есть два варианта:

1 . Найти и удалить скрипт из другого GameObject:

enter image description here

2 . Используйте мою функцию FindInActiveObjectByTag, чтобы найти деактивированные объекты GameObject, если вам нужнонайти неактивные GameObjects.

...