C # (Unity) - данные не попадают в скрипты - PullRequest
0 голосов
/ 31 октября 2018

Просто немного предыстории: я пытаюсь сделать мини-игру викторины (очень простую, а не коммерческую или что-то еще) в единстве. Я следовал руководству по тому, как это сделать, но столкнулся с этой ошибкой, и я не уверен, как ее отладить. По просмотру в Интернете я могу сказать, что это распространенная ошибка, но я не вижу, что я делаю неправильно.

Я получаю исключение 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);
}
}

1 Ответ

0 голосов
/ 31 октября 2018

Проблема, вероятно, в вашем GameController классе. Переменная answerData никогда не устанавливается (так как она является закрытой, она может быть установлена ​​только в вашем классе GameController, и это не так), но она используется в ShowQuestion().

Возможно, вам придется добавить некоторый код в ShowQuestion() или другой метод в GameController, чтобы получить ответы от вашего DataController объекта и поместить его в answerData. Сейчас ничего не происходит, поэтому answerData равно нулю, и Unity возвращает ошибку.

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