Просто немного предыстории: я пытаюсь сделать мини-игру викторины (очень простую, а не коммерческую или что-то еще) в единстве. Я следовал руководству по тому, как это сделать, но столкнулся с этой ошибкой, и я не уверен, как ее отладить. По просмотру в Интернете я могу сказать, что это распространенная ошибка, но я не вижу, что я делаю неправильно.
Я получаю исключение NullReferenceException: ссылка на объект не установлена на экземпляр ошибки объекта в функции HandleClick () в моем сценарии AnswerButton, и я не уверен, насколько answerData является пустым. У меня также есть скрипты DataController, QuestionData и RoundData.
изображение, показывающее заполненные данные
Это мой сценарий AnswerButton:
public class AnswerButton : MonoBehaviour {
private AnswerData answerData;
private GameController gameController;
// Use this for initialization
void Start () {
gameController = FindObjectOfType<GameController>();
}
public void Setup(AnswerData data)
{
answerData = data;
}
public void HandleClick()
{
gameController.AnswerButtonClicked(answerData.isCorrect);
}
}
Это мой сценарий AnswerData:
[System.Serializable]
public class AnswerData {
public string answerText;
public bool isCorrect;
}
Скрипт GameController:
public class GameController : MonoBehaviour {
[SerializeField] private Text questionText;
[SerializeField] private Text scoreText;
private DataController dataController;
private RoundData currentRoundData;
private QuestionData[] questionPool;
private AnswerData answerData;
private AnswerButton answerButton;
public GameObject questionDisplay;
public GameObject roundEndDisplay;
private bool isRoundActive;
private float timeRemaining;
private int questionIndex;
private int playerScore;
private void Start()
{
dataController = FindObjectOfType<DataController>();
currentRoundData = dataController.GetCurrentRoundData();
questionPool = currentRoundData.questions;
timeRemaining = currentRoundData.timeLimitInSeconds;
playerScore = 0;
questionIndex = 0;
ShowQuestion();
isRoundActive = true;
}
private void ShowQuestion()
{
QuestionData questionData = questionPool[questionIndex];
questionText.text = questionData.questionText;
answerButton.Setup(answerData);
}
public void AnswerButtonClicked(bool isCorrect)
{
if (isCorrect)
{
playerScore += currentRoundData.pointsAddedForCorrectAnswer;
scoreText.text = "Score: " + playerScore.ToString();
}
if (questionPool.Length > questionIndex + 1)
{
questionIndex++;
ShowQuestion();
} else
{
EndRound();
}
}
public void EndRound()
{
isRoundActive = false;
questionDisplay.SetActive(false);
roundEndDisplay.SetActive(true);
}
}