Где хранить состояние: Entity, Resource или Autoload
Выбрать время жизни данных и место их изменения; общая сессия не должна владеть всем проектом.
Сначала определить время жизни
| Данные/поведение | Подходящее место |
|---|---|
| Здоровье одного противника, локальная анимация | Entity/компонент внутри его префаба |
| Цель миссии, список противников текущего уровня | Контроллер уровня |
| Счёт забега, переходящий между уровнями | Явная служба сессии вне заменяемого корня, например Autoload |
| Настраиваемое описание оружия или материала | Resource с понятной политикой общего доступа |
| Данные, переживающие закрытие игры | Сериализованная схема в user:// |
Autoload — способ создать объект при запуске и пережить замену CurrentScene, а не обязательное место для каждого менеджера. Долгоживущий объект можно организовать и через постоянный корень приложения. Выбор должен делать время жизни явным.
Ограничить место изменения
SessionState разрешает AddCoins/ResetRun и сообщает CoinsChanged. HUD отображает данные и снимает подписку при выходе. Служба не знает путь до интерфейса; уровень не должен напрямую переписывать случайные внутренние поля службы.
Для локального поведения GroupTarget2D работает без GetParent и без глобального сервиса: внешний контроллер передаёт действие ApplyDamage. Стенд проверяет создание отдельного получателя без родителя. Группа при этом остаётся динамическим набором, а не типобезопасным интерфейсом.
Что не решает выбор контейнера
Resource может быть общим у нескольких экземпляров. Не складывайте изменяемое здоровье каждого противника в один общий конфигурационный ресурс, если не хотите общий результат. Для копирования и загрузки см. Resource.
Autoload не делает данные сохранёнными на диск, потокобезопасными или защищёнными от второго экземпляра класса. Отключение _Process не блокирует его методы. Сетевую авторитетность и проверку команд также задаёт логика приложения.
Проверить выбранную границу
- Создать компонент отдельно от большого уровня: он работает или явно сообщает, какая зависимость нужна.
- Удалить и пересоздать уровень: локальные данные сбрасываются, сессия сохраняется только там, где задумано.
- Отсоединить и вернуть HUD: обновление приходит один раз, начальное значение перечитывается.
- Начать новый забег: общие данные сбрасываются явной командой, а не случайной перезагрузкой уровня.
Эти случаи выполнены на примерах SessionState/SessionHud и GroupTarget2D. Они подтверждают границы конкретных компонентов, а не универсальное преимущество одного архитектурного шаблона.