Сохранение получения NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта OptionsConfig.Update () (в Assets / OptionsConfig.cs: 45) - PullRequest
0 голосов
/ 18 января 2019

У меня проблема с моим кодом. Я пытаюсь включить и выключить одно из моих меню с помощью метода setActive и установить для GameObject значение Object PauseMenu. Я использую enum для настройки различных состояний меню, но оно все еще не распознает PauseMenu. Я проверил, что имя правильное и все, но я все еще не могу понять это, поэтому я надеюсь, что один из вас может помочь.

public class OptionsConfig : MonoBehaviour {
public enum MenuPhase
{
    CLOSED,
    MENU,
    INVENTORY
}

public MenuPhase currentPhase;

int CursorPosition;
private static GameObject OptionsPanelCursor;
public static GameObject PauseMenu;
public static GameObject InventoryMenu;
public static bool PauseMenuOpen;

void Start()
{
    OptionsPanelCursor = GameObject.Find("OptionsPanelCursor");
    InventoryMenu = GameObject.Find("InventoryMenu");
    PauseMenu = GameObject.Find("PausePanel");
    PauseMenuOpen = false;
    //InventoryMenu.SetActive(false);
    currentPhase = MenuPhase.CLOSED;

    Debug.Log(PauseMenuOpen);
}

// Update is called once per frame
void Update()
{
    switch (currentPhase)
    {
        case (MenuPhase.CLOSED):
            if (Input.GetKeyDown(KeyCode.Escape))
            {
                {
                    Debug.Log("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
                    GameObject Character = GameObject.Find("CharacterOverworld");
                    Character.GetComponent<CharacterController>().enabled = false;
                    PauseMenu.SetActive(true);
                    PauseMenuOpen = true;
                    currentPhase = MenuPhase.MENU;
                }
                if (PauseMenuOpen == true)
                {

                    GameObject Character = GameObject.Find("CharacterOverworld");
                    Character.GetComponent<CharacterController>().enabled = true;
                    PauseMenu.SetActive(false);
                    PauseMenuOpen = false;
                }
            }
            break;
        case (MenuPhase.MENU):
            if (Input.GetKeyDown(KeyCode.S))
            {
                CursorPosition = CursorPosition + 1;
                OptionsPanelCursor.transform.Translate(-31.75f, 0.0f, 0.0f);
                if (CursorPosition > 6)
                {
                    OptionsPanelCursor.transform.Translate(31.75f, 0.0f, 0.0f);
                    CursorPosition = 6;
                }
            }
            if (Input.GetKeyDown(KeyCode.W))
            {
                CursorPosition = CursorPosition - 1;
                OptionsPanelCursor.transform.Translate(31.75f, 0.0f, 0.0f);
                if (CursorPosition < 0)
                {
                    OptionsPanelCursor.transform.Translate(-31.75f, 0.0f, 0.0f);
                    CursorPosition = 0;
                }
            }
            if (Input.GetKeyDown(KeyCode.Return))
            {

                if (CursorPosition == 0 || CursorPosition == -1)
                {
                    InventoryManage();
                }
                if (CursorPosition == 1)
                {

                }
                if (CursorPosition == 2)
                {

                }
                if (CursorPosition == 3)
                {

                }
                if (CursorPosition == 4)
                {

                }
                if (CursorPosition == 5)
                {

                }
                if (CursorPosition == 6 || CursorPosition == 7)
                {

                }
            }
            break;
    }
}

1 Ответ

0 голосов
/ 18 января 2019

Очевидно, что объект в строке 45 является нулевым.

Вы используете GameObject.Find, пожалуйста, проверьте имя еще раз, и будьте осторожны, оно возвращает только активный GameObject.

  1. PauseMenu является открытым статическим полем, поэтому его можно установить равным нулю из другого скрипта.

  2. Кроме того, поскольку это открытое статическое поле, после того, как вы установите его неактивным, вы создадите еще один экземпляр OptionsConfig, метод Start снова запустится, чтобы установить для PauseMenu значение null. Обратите внимание, что статическое поле совместно используется экземплярами, поэтому в это время все OptionsConfig не будут работать.

  3. Когда PauseMenu неактивен, вы все равно можете вызвать Start в скрипте или с помощью GameObject.SendMessage и т. Д., И установить PauseMenu на ноль.

  4. В единице доступа к свойству объекта GameObject после его уничтожения возникнет исключение NullReferenceException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...