2016-12-18 3 views
-2

Я знаю, на этот вопрос уже был дан много ответа, и поверьте мне, я пробовал так много способов исправить эту проблему, но это происходит снова и снова.Unity C# NullReferenceException

Так что, в основном, я пытаюсь изменить, например. деньги в моей игре, из другого сценария.

Но как только я нажимаю кнопку, я получаю это сообщение об ошибке. Я думаю, что я делаю что-то принципиально неправильно здесь, но это также происходит в моем бальном сценарии, но все еще работает, так или иначе ... Но вот ошибка:

NullReferenceException: Object reference not set to an instance of an object 
Score.ResetScore() (at Assets/Scripts/Score.cs:36) 

А вот скрипты, которые должны работа вместе.

Сценарий 1:

void ResetScore() 
    { 
     GameManager gamemanag = GetComponent<GameManager>(); 
     score = 0; 
     gamemanag.ResetQuestions(); 
    } 

Сценарий 2:

public void ResetQuestions() 
    { 
     unansweredQuestions = questions.ToList<Question>(); 
    } 

Это была оценка сценария, потому что это немного чище. Это не работает так, как должно, и у меня нет идеи, почему ...

Я отправляю полный код на pastebin в конце.

Было бы здорово, если бы вы могли помочь!

Сценарий 1: http://pastebin.com/raw/qvbFYd3x

Сценарий 2: http://pastebin.com/raw/8gMzaagq

+2

Единственный способ, что 'ResetScore()' может вызывать 'NullReferenceException', это если' GetComponent () 'возвращает' null'. Это возможно в зависимости от конфигурации. Это заставляет меня думать, что проблема не в вашем коде, а в вашей конфигурации, которая не является частью вашего вопроса. – hvd

ответ

1

Есть несколько вещей происходит:

  1. (Почему вы заходящего счет 0, если оценка == 0? вы можете просто оставить еще далеко.)

  2. в DisplayScore вы обращаетесь к scoreText поле. Это вызовет NullReferenceException, если у вас нет , установите его в инспекторе.

  3. В ResetScore вы получаете экземпляр GameManager.Вызов ResetQuestions будет вызывать NullReferenceException, если ваш игровой объект, содержащий скрипт Score, также не содержит сценарий GameManager.

  4. В Start из GameManager вы могли бы получить NullReferenceException если вы не установили какой-либо вопрос в инспекторе.

  5. У вас есть от Ошибка в вашем SetCurrentQuestion. В принципе, если вопросов нет, вы получаете случайное число от 0 до 0. Единственный допустимый результат - 0 в этой ситуации. Затем вы получаете доступ к вопросу с индексом 0. Но его не будет. (Это будет сгенерировано IndexOutOfRangeException)

  6. Любой из ваших частных [SerializeField] полей может бросить NullReferenceException, если он не был назначен в инспекторе.

Как вы можете видеть, многие из ваших утверждений может привести к NullReferenceException. Мы не сможем на самом деле сказать вам, где проблема, потому что она может быть во многих местах. Вам лучше всего отладить свой код и проверить, где переменная, к которой вы пытаетесь получить доступ, равна null.

+0

Спасибо за ваш ответ! Я изменил его в ResetScore, если (оценка! = 0) score = 0; Так что номер 1 вышел, я думаю. Я все еще получаю ошибку. Я установил Scoretext повсюду, так что номер 2 вышел, как я полагаю. Я также задал вопросы, так что номер 4 тоже. Номер 5, я установил диапазон от 0 до числа всех неотвеченных вопросов, выше, чем я проверил, остались ли оставшиеся вопросы без ответа, и если бы они не были, я обновил список. Поэтому я не думаю, что это будет проблемой. И у меня нет никаких SerializeFields, которые не назначены, поэтому это должно быть 3. – thaiten

+0

Вы имеете в виду, что я должен добавить GameManager Script для каждого Игрового объекта, на котором есть Score Script? Мне нужно будет заполнить Вопросы дважды, не так ли? – thaiten

+0

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

0

любой объект может быть пустым ...

просто проверить код:

GetComponent<GameManager>(); 

не может дать вам не GameManager,

questions.ToList<Question>(); 

или ваш список не инициализирован. Закрепить ее:

unansweredQuestions = new List<Question>(); 

Вам нужно отлаживать код непосредственно, или просто проверить = NULL

Смежные вопросы