Решили: боевой скоуп рождается и умирает вместе с боем. Владелец один — BattleHost в мировом
скоупе: Open(preset) создаёт дочерний скоуп из префаба BattleScope.prefab, Close() его хоронит.
Обе двери ведут в него: забег через IBattleSession, dev-консоль вызовом напрямую.
Почему: пока скоуп жил всю сессию, каждый переход между боями приходилось доводить руками —
чистить арену сбросом, пересевать генератор, пере-ставить отряд, — и любая забытая строка становилась
багом, которого не видно. Теперь переход это рождение и смерть объекта, а перечисленное случается
само. Второй двери (консоль → EncounterLoader живого скоупа) быть не может по построению: между
боями скоупа не существует, и «найти» его нечем.
Грабли:
IStartableвызывается НЕ синхронно — VContainer диспатчит его в фазеStartupигрового цикла, аDestroyобъекта скоупа отложен до конца кадра. Значит при рестарте (Close+Openодним вызовом) два скоупа на миг сосуществуют, и умирающий успевает отвязаться ПОСЛЕ того, как новый привязался. Лечится тем же приёмом, что уже стоял в роутере кадра: отвязывают всегда «своё» (UnbindBattle(who)), чужую привязку не трогают.RegisterComponentInHierarchyищет только в сцене своего скоупа (FindComponentProviderзапоминает её при регистрации). Персист-сцен у нас две, и презентеры лежат в той, что грузится ПОЗЖЕ мира, — регистрация из мира не нашла бы ничего. Пока объекты не переехали вWorldScene, используетсяScopeWiring.RegisterPersistComponent— ленивый поиск по загруженным сценам. Это признанный долг, а не решение: он уйдёт вместе с расформированиемCombatSystemsScene(шаг 1в).- Игра не ссылается на dev-слой, поэтому мировой скоуп не может зарегистрировать консоль — ссылка
развернулась бы не в ту сторону. Консоль подключается к миру сама (
Awake→LifetimeScope.Find), и это честнее: dev-слой знает про игру, а не наоборот. - Боевых ссылок консоль больше не держит вовсе. Симуляция и фабрика спрашиваются у хоста в момент команды — запомненные протухли бы на первом же переходе между узлами. Заодно исчезла старая диагностика «инъекция потеряна, перезапусти play-mode»: терять стало нечего.
- Дев-срезы сами открывают арену.
kit spearmanвне боя означает «мне нужна арена», а не «ничего не делать»: команда открывает пустой dev-бой транзиентным пресетом. Иначе инструмент стал бы менее полезен, чем был при вечной симуляции, — а рез делался не ради этого.
Владелец правды: Game/Flow/BattleHost.cs, Game/Flow/BattleStartup.cs,
Game/Flow/BattleScopeParams.cs; тесты SceneWiringTests (префаб боевого скоупа обязателен у мира) и
CombatTestValuesMatchTheGameTests.CellSize_MatchesTheBattleScopePrefab.