使用StartCoroutine时出现MissingReferenceException错误-Unity

时间:2018-09-19 09:57:50

标签: c# unity3d

我一直在构建一个问答游戏,该游戏从列表中随机选择一个游戏对象,问题完成后,它会为新问题重新加载场景,但是,它会指出此错误:

  

MissingReferenceException:'GameObject'类型的对象已被破坏,但您仍在尝试访问它。   您的脚本应检查其是否为null或不破坏该对象。

     

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 :(得分:0)

错误说明了一切。在游戏的第一次运行中,您会发现GameManager.cs已附加到有效的GameObject上并且运行良好。但是,当您重新加载新场景时,场景中的所有对象都将被破坏,第二个场景也将被加载。

因此,不再有GameManager上下文。与您的GameManager.cs脚本关联的GameObject被销毁。由于GameManager.cs中的所有数据都是静态的,因此建议您将其设为static类,或者,如果要保留对象,请使用DontDestroyOnLoad

答案 1 :(得分:0)

如果您不破坏任何物体, 重新加载场景时,unansweredQuestions列表中的某些对象可能会被破坏。 因此,当您从GetQuestion()获取引用时,它将返回对销毁对象的引用。因此,当您尝试将其设置为活动状态时,它将引发此异常。

您可以通过在GetQuestion()中获取currentQuestion是否为null来轻松解决此问题。

但是更好地解决破坏对象的原因。

在GetQuestion()中获取currentQuestion之后,立即尝试将其从unansweredQuestions中删除。

如果还有其他脚本正在访问问题列表,则可能是问题所在。 如果问题列表中的对象被破坏,则unansweredQuestions中的对象也将被破坏。

答案 2 :(得分:0)

*编辑。好的,所以nvm是GameManager。错误出现在第30行,由您的输出表示。

第30行是:      currentQuestion.SetActive(true);

此错误表示currentQuestion为空。如果您要重新加载场景,则需要在void Start()中将其设置为问题,然后再尝试将其设置为活动状态。