Ссылка на объект не установлена ​​для экземпляра объекта, она работала вчера, открылась сегодня и выдает ошибки - PullRequest
0 голосов
/ 12 апреля 2019

По сути, я создаю проект с дополненной реальностью для Vuforia в Unity. Я очень плохо знаком с C #, поэтому код может быть не таким оптимальным, я знаю, но это сработало. Я сохранил и вышел вчера и сегодня, когда я открыл его, чтобы снова протестировать и развить, внезапно появляются ошибки, которые говорят:

NullReferenceException: Object reference not set to an instance of 
an object
marsHVB_script.Start () (at Assets/marsHVB_script.cs:11)

У меня есть два отдельных скрипта, один из которых главный:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;

public class main : MonoBehaviour
{
    public static GameObject helpObj;
    public static GameObject NVB;
    public static GameObject BVB;
    public static GameObject helpMsg;
    public static GameObject nText1;
    public static GameObject nText2;
    public static GameObject nText3;
    public static GameObject nText4;
    public static int stage = 1;
    // Start is called before the first frame update
    void Start()
    {
        helpObj = GameObject.Find("marsHVB");
        helpMsg = GameObject.Find("marsHelp");
        nText1 = GameObject.Find("nText1");
        nText2 = GameObject.Find("nText2");
        nText3 = GameObject.Find("nText3");
        nText4 = GameObject.Find("nText4");
        nText2.SetActive(false);
        nText3.SetActive(false);
        nText4.SetActive(false);
        helpMsg.SetActive(false);

    }

    public static void IncrStage()
    {
        stage++;
        Debug.Log("Stage Increased to " + stage);
    }
    public static void DecrStage()
    {
        stage--;
        Debug.Log("Stage Decreased to " + stage);
    }
    public static int GetStage()
    {
        Debug.Log("Stage Got " + stage);
        return stage;
    }
    // Update is called once per frame
    void Update()
    {

    }
}

В коде, представленном ниже, я создаю открытые статические переменные, которые должны быть доступны из других скриптов. Я нахожу их и выключаю после.

Затем есть второй скрипт, который управляет виртуальной кнопкой:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;

public class marsHVB_script : MonoBehaviour, IVirtualButtonEventHandler
{

    void Start()
    {
        main.helpObj.GetComponent<VirtualButtonBehaviour>().RegisterEventHandler(this);
    }

    void IVirtualButtonEventHandler.OnButtonPressed(VirtualButtonBehaviour vb)
    {
        switch (main.GetStage())
        {
            case 1:
                main.nText1.SetActive(false);
                main.helpMsg.SetActive(true);
                break;
            case 2:
                main.nText2.SetActive(false);
                main.helpMsg.SetActive(true);
                break;
            case 3:
                main.nText3.SetActive(false);
                main.helpMsg.SetActive(true);
                break;
            case 4:
                main.nText4.SetActive(false);
                main.helpMsg.SetActive(true);
                break;
        }

        Debug.Log("Help Pressed");
    }

    void IVirtualButtonEventHandler.OnButtonReleased(VirtualButtonBehaviour vb)
    {

        switch (main.GetStage())
        {
            case 1:
                main.helpMsg.SetActive(false);
                main.nText1.SetActive(true);
                break;
            case 2:
                main.helpMsg.SetActive(false);
                main.nText2.SetActive(true);
                break;
            case 3:
                main.helpMsg.SetActive(false);
                main.nText3.SetActive(true);
                break;
            case 4:
                main.helpMsg.SetActive(false);
                main.nText4.SetActive(true);
                break;
        }
        Debug.Log("Help Removed");
    }

    // Update is called once per frame
    void Update()
    {

    }
}

Этот второй скрипт реагирует на нажатие и отпускание виртуальной кнопки. Ошибка выводится в строке 11, которая является функцией main.helpObj.GetComponent, и вчера она работала, сегодня - нет.

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

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Вы никогда не должны использовать Start void для инициализации переменных в вашем коде.Awake обычно используется для этого, поскольку Awake всегда вызывается раньше Start.

Если вы измените Start() в вашем классе main на Awake(), вы убедитесь, чтоhelpObj всегда назначается до того, как marsHVB_script class попытается получить к нему доступ.

0 голосов
/ 22 апреля 2019

Вы можете использовать функцию Reset () и поместить весь код, который вы написали, в функцию Start.это позволит вам устанавливать ссылки, не играя в игру.

void Reset()
{
    helpObj = GameObject.Find("marsHVB");
    helpMsg = GameObject.Find("marsHelp");
    nText1 = GameObject.Find("nText1");
    nText2 = GameObject.Find("nText2");
    nText3 = GameObject.Find("nText3");
    nText4 = GameObject.Find("nText4");
    nText2.SetActive(false);
    nText3.SetActive(false);
    nText4.SetActive(false);
    helpMsg.SetActive(false);

}

Напишите это, вернитесь в редактор.Нажмите на значок шестеренки на компоненте скрипта и нажмите «Сброс».Он установит все ссылки, а затем вы можете безопасно удалить эту функцию запуска.

...