Один компонент заполняет данные в 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 либо в явный шаг инициализации
