Ошибка оценки обновления Unity3D

Я следую руководству Charger Games на YouTube, посвященному игре Street Racer для Android, и я вижу эту ошибку на консоли Unity3D, в которой говорится
NullReferenceException: Object reference not set to an instance of an object UIManager.scoreUpdate ()

Это код, в котором есть строка, вызвавшая ошибку

public Text scoreText;
int score;

void Start () {
    score = 0;
    InvokeRepeating("scoreUpdate", 1.0f, 0.5f);
}
void Update () {
    scoreText.text = "Score: " + score; //this is the line. If I erase this the error will disappear
    }
void scoreUpdate () {
    if (gameOver == false) {
        score += 1;
        }
    }

Если я его удалю, ошибка исчезнет. Это не вызывает сбоев или чего-то еще, мне просто любопытно, потому что я хочу учиться. Пожалуйста, помогите мне, ребята


person Noobs    schedule 02.04.2017    source источник


Ответы (3)


Трудно сказать по этому маленькому коду. Вы пытаетесь получить доступ (и установить) к свойству «Текст» какого-либо объекта, но поле scoreText, вероятно, не указывает ни на какой такой объект. То же самое произошло бы, если бы у вас был, например, массив целых чисел, такой как int[] myArray = null; а затем попытался прочитать его свойство «Длина» следующим образом: myArray.Length, что также привело бы к ошибке нулевой ссылки. Сначала вам нужно сделать так, чтобы поле ссылалось на объект.

В Unity вы, наверное, забыли перетащить GameObject в поле «scoreText» вашего скрипта, чтобы установить ссылку?

person Demo    schedule 02.04.2017
comment
Я перетащил партитуру в сценарий. Оценка работает нормально, но я все еще вижу ту же красную ошибку на консоли. - person Noobs; 02.04.2017
comment
Тогда не знаю. Что это за метод UIManager.scoreUpdate()? Похоже, вы пытаетесь обновить счет в двух местах: scoreUpdate() и Update() какого-то скрипта или какая связь между этими двумя методами? Разве ваша оценка не обновляется даже после комментирования scoreText.text = Score: + score; линия? - person Demo; 02.04.2017
comment
scoreUpdate только увеличивает счет, в то время как scoreText только показывает, что счет обновляется в виде текста. - person Noobs; 03.04.2017
comment
Я бы удалил InvokeRepeating(), как сказал @MathieuAuclair, поскольку вы уже обновляете обновление, но я не думаю, что это причина. Для отладки я бы поставил if (scoreText == null) {Debug.Log("The scoreText reference is null");} else if (scoreText.Text == null){Debug.Log("The text property is null");} Debug.Log(String.Format("The calling object is {0} in scene {1}.", this.name, this.gameObject.scene.name)); в Update(). Я предполагаю, что вы также прикрепили скрипт к какому-то другому GO, и вы не прикрепили объект графического интерфейса счета к этому другому приложению скрипта в инспекторе. - person Demo; 03.04.2017
comment
Эй, я такой тупой. Я нашел ошибку. В игре есть 2 сцены, каждая из которых имеет UI Manager. Я перетащил scoreText на сцену уровня 1, в то время как сцена menu все еще требует этого. Я исправил это, сделав пустой текст, чтобы заменить scoreText на сцену menu. Спасибо за помощь. Очень ценю. - person Noobs; 04.04.2017

Знаменитая ошибка исключения нулевой ссылки возникает, когда вы пытаетесь получить доступ к объекту/ссылке, который не инициализирован должным образом. Как указано в документах Unity

NullReferenceException возникает, когда вы пытаетесь получить доступ к ссылочной переменной, которая не ссылается на какой-либо объект. Если ссылочная переменная не ссылается на объект, она будет рассматриваться как null. Время выполнения сообщит вам, что вы пытаетесь получить доступ к объекту, когда переменная имеет значение null, выдав исключение NullReferenceException.(подробнее)

Теперь, в частности, в вашем вопросе, вы пытаетесь получить доступ к объекту scoreText, который не назначен должным образом. Убедитесь, что вы назначили scoreText в инспекторе, к которому прикреплен ваш скрипт.

person Muhammad Faizan Khan    schedule 03.04.2017
comment
Эй, я такой тупой. Я нашел ошибку. В игре есть 2 сцены, каждая из которых имеет UI Manager. Я перетащил scoreText на сцену уровня 1, в то время как сцена menu все еще требует этого. Я исправил это, сделав пустой текст, чтобы заменить scoreText на сцену menu. Спасибо за помощь. Очень ценю. - person Noobs; 04.04.2017

Убедитесь, что ваш gameObject не пуст, gameObject не будет выбран по волшебству! Так что попробуй это

public Text scoreText;
private score;

void Start() {
  score = 5; //example
}

void Update() {
    scoreText.text = "Score: " + score;
}

Снимок экрана инспектора

После этого вам нужно будет назначить свой общедоступный gameObject и текст вашему сценарию, поэтому выберите экземпляр, который вы дали своему сценарию, и проверьте в инспекторе, вы увидите [none(Text)], нажмите его и выберите свой UItext

Веселиться!

person MathieuAuclair    schedule 02.04.2017
comment
Я добавил больше кодов. Да я уже перетащил туда счет Текст - person Noobs; 03.04.2017
comment
попробуйте удалить повторение Invoke, и это должно сработать или остановить обновление вашего пользовательского интерфейса в Update (), потому что вы обновляете дважды - person MathieuAuclair; 03.04.2017
comment
docs.unity3d.com/ScriptReference/, если вы отметите здесь, они используют это, это может помочь вам;) - person MathieuAuclair; 03.04.2017
comment
Эй, я такой тупой. Я нашел ошибку. В игре есть 2 сцены, каждая из которых имеет UI Manager. Я перетащил scoreText на сцену уровня 1, в то время как сцена menu все еще требует этого. Я исправил это, сделав пустой текст, чтобы заменить scoreText на сцену menu. Спасибо за помощь. Очень ценю. - person Noobs; 04.04.2017