Ссылка на объект не установлена, если у меня есть ссылка - PullRequest
0 голосов
/ 03 апреля 2020

РЕДАКТИРОВАТЬ: я изменил Awake на Пуск, и теперь он работает. Может кто-нибудь объяснить, почему это так?

У меня есть простой код:

public class UIManager : MonoBehaviour
{
    public GameObject deathScreen;

    public void Awake() {
        GameEvents.instance.OnRestart += ShowDeathScreen; //line 10
    }

    private void ShowDeathScreen() {
        deathScreen.SetActive(true);
    }
}

Я назначил объект в deathScreen в редакторе, почему я получаю эту ошибку? Извините, если это глупый вопрос, только что начал учиться.

Вся ошибка:

NullReferenceException: Object reference not set to an instance of an object
UIManager.Awake () (at Assets/UIManager.cs:10)

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

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

Порядок выполнения - реальная вещь

Senario:

ObjectA
  Awake()

ObjectB
  static variable1
  public variable2
  Awake()

Итак, в результате ObjectA он говорит: go получить переменную stati c из ObjectB .. но objectB еще не был создан, но его следующий ..

Изменение objectA для использования Start () исправит это, потому что запуск выполняется до первого кадра, к тому времени, все сделано.

Потенциально, если вы перемещаете objectB перед objectA в иерархии, это также может помочь, но не обязательно надежно

Другой вариант - вручную установить порядок, необходимый для выполнения скриптов ваших проектов. order.

Короче говоря, вещи, которые go в состоянии бодрствования, должны быть самодостаточными, например, элементы, связанные только с этим объектом, например, установка singleton, инициализация переменных, которые не зависят от других вещей. Короче говоря, с человеческой точки зрения, все, что вы можете сделать вокруг своего дома. Начало - это то место, куда вы помещаете следующую волну действий, основанных на других вещах, например, на использовании внешних данных clasd, поскольку вы знаете, что они зашли так далеко.

Конечно, вы все равно можете запустить Если у вас есть циклические зависимости типа, как будто для запуска в Object C нужны данные из ObjectD, но D для этого нужно C ...

0 голосов
/ 03 апреля 2020

Объяснил поиск ошибок, запуск всегда запускается после пробуждения для всех классов. Вы можете проверить Документация Unity о порядке выполнения для получения дополнительной информации о нем.

Короче говоря, сначала вызывается Awake (для всех Active gameObject), затем Start, но вы не можете полагаться на определенный c порядок (если только не начнете возиться с порядком выполнения скрипта) проснуться / начать звонить. Например, если у вас есть сценарии UIManager, GameManager, PlayerController, использующие Awake () для инициализации, все они могут быть инициализированы в таком порядке, но не могут. Обычно в редакторе иерархия сцены используется для порядка, но на устройстве / сборках порядок может быть другим.

Если вам нужна инициализация, чтобы выполнить порядок, я предлагаю вам иметь скрипт, который вызывает функции Initialize () для других скриптов , Это ожидание вы можете установить порядок, который вы хотите.

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