我一直在构建一个问答游戏,该游戏从列表中随机选择一个游戏对象,问题完成后,它会为新问题重新加载场景,但是,它会指出此错误:
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还是比较陌生,因此,如果您能指出造成这种情况的原因,我将不胜感激。预先谢谢你。
答案 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()
中将其设置为问题,然后再尝试将其设置为活动状态。