Ошибка MissingReferenceException при использовании StartCoroutine - Unity - PullRequest
0 голосов
/ 19 сентября 2018

Я строил игру-викторину, которая случайным образом выбирает игровой объект из списка, и после того, как вопрос завершен, он перезагружает сцену для нового вопроса, однако он сообщает об этой ошибке:

MissingReferenceException: Объект типа «GameObject» был уничтожен, но вы все еще пытаетесь получить к нему доступ.Ваш сценарий должен либо проверить, является ли он нулевым, либо вы не должны уничтожать объект.

GameManager.Start () (в Assets / Scripts / GameManager.cs: 30)

Иэто код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.SceneManagement;
 
public class GameManager : MonoBehaviour {
 
    public static int betul1 = 0;
    public static int betul2 = 0;
    public static int salah1 = 0;
    public static int salah2 = 0;
 
    public GameObject[] questions;
    private static List<GameObject> unansweredQuestions;
    private GameObject currentQuestion;
 
    [SerializeField]
    private float transitionTime = 1f;
 
    void Start()
    {
       
       if (unansweredQuestions == null || unansweredQuestions.Count == 0)
         {
             unansweredQuestions = questions.ToList<GameObject>();
         }
       
        GetQuestion();
        currentQuestion.SetActive(true);
    }
 
    void GetQuestion()
    {
        int randomNumber = Random.Range(0,unansweredQuestions.Count);
        currentQuestion = unansweredQuestions[randomNumber];
    }
 
    IEnumerator NextQuestion()
    {
 
        unansweredQuestions.Remove(currentQuestion);
        //currentQuestion.SetActive(false);
   
        yield return new WaitForSeconds(transitionTime);
 
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
 
    public void Yes()
    {
        if (betul1 == 1 && betul2 == 1)
        {
            Debug.Log("Congratulations! You're correct!");
            StartCoroutine(NextQuestion());
        }
 
        if (salah1 == 1 && salah2 == 1)
        {
            Debug.Log("Sorry! You're wrong!");
            StartCoroutine(NextQuestion());
        }
 
        if (betul1 == 1 && salah2 == 1)
        {
            Debug.Log("Your answer is invalid. Please fix it.");
        }
 
        if (betul2 == 1 && salah1 == 1)
        {
            Debug.Log("Your answer is invalid. Please fix it.");
        }
    }
}

Я не уверен, что с этим не так.Я все еще относительно новичок в Unity, поэтому я был бы очень признателен, если бы вы указали, что является причиной этого.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Если вы не уничтожите какие-либо объекты, возможно, некоторые объекты в списке неотвеченных вопросов будут уничтожены при перезагрузке сцены.Поэтому, когда вы получаете ссылку из GetQuestion (), она возвращает ссылку на уничтоженный объект.Поэтому, когда вы пытаетесь установить его активным, он выдает это исключение.

Вы можете легко это исправить, проверив currentQuestion на null после получения его в GetQuestion ().

Но лучше устранить причинууничтожения объектов.

Попробуйте удалить currentQuestion из неотвеченных вопросов сразу после того, как вы получите его в GetQuestion ().

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

0 голосов
/ 19 сентября 2018

* Изменить.хорошо, так что NVM GameManager.ошибка в строке 30, обозначаемая вашим выводом.

строка 30: currentQuestion.SetActive (true);

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

0 голосов
/ 19 сентября 2018

Ошибка объясняет все это.При первом запуске игры вы обнаружите, что GameManager.cs подключен к действительному GameObject и работает нормально.Но когда вы перезагружаете новую сцену, все объекты в сцене уничтожаются, а вторая сцена загружается.

Таким образом, больше нет контекста GameManager.GameObject, с которым был связан ваш GameManager.cs скрипт, уничтожен.Поскольку все данные в GameManager.cs являются статическими, я бы предложил сделать их классом static или, если вы хотите сохранить объект, использовать DontDestroyOnLoad

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