Вступить в клуб →
средняявопросC# и жизненный цикл Unity

Один компонент заполняет данные в Awake, другой читает их в Awake — иногда пусто

Два компонента на разных объектах сцены:

public class Inventory : MonoBehaviour
{
    public List<Item> Items { get; private set; }
    void Awake() { Items = LoadFromSave(); }
}

public class InventoryHud : MonoBehaviour
{
    [SerializeField] private Inventory inventory;
    void Awake() { Redraw(inventory.Items.Count); }
}

В большинстве запусков всё работает, но примерно раз в несколько запусков в HUD рисуется ноль ячеек или в лог падает обращение к пустой ссылке. После пересборки сцены поведение меняется. Что происходит?

  • Порядок вызова Awake у объектов сцены строго задан сверху вниз по иерархии, поэтому достаточно поднять объект с Inventory выше остальных в списке
  • Ошибка в том, что список создаётся в Awake, а не в конструкторе компонента
  • Замена обоих Awake на OnEnable сделает порядок предсказуемым: OnEnable вызывается строго по порядку включения компонентов и всегда после всех Awake
  • Порядок Awake у разных объектов не гарантирован: чтение чужих данных переносят в Start либо в явный шаг инициализации

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела