Организовать уровень и зависимости префабов
Кто создаёт объекты, кто хранит состояние и кто снимает подписки; проверяемая структура вместо глубокой сети путей.
Разделить ответственность
У корня уровня держите контроллер сценария и контейнеры по смыслу: мир, интерфейс, локальные эффекты. Префаб персонажа содержит его собственные визуальные и физические части. Общая сессия живёт вне заменяемого корня только тогда, когда должна пережить его удаление.
Это объектная иерархия Entity. Имена контейнеров не превращают её в ECS и не добавляют streaming. Количество детей само по себе не является измерением производительности.
| Вопрос | Назначьте ответственного |
|---|---|
| Кто создаёт и удаляет противника? | Контроллер уровня или явный спавнер |
| Кто меняет здоровье? | Компонент здоровья с ограниченным API |
| Кто слушает событие смерти? | Внешний контроллер, которому это нужно |
| Кто отображает счёт сессии? | HUD с подпиской и начальным снимком |
| Кто освобождает отсоединённую комнату? | Хост/кэш, который её удерживает |
Передать зависимость, а не угадывать окружение
Внутренний стабильный путь ребёнка допустим, когда префаб действительно владеет этой структурой. Для внешней цели передавайте ссылку или данные до AddChild. Для сообщения о намерении используйте сигнал; источник не обязан искать родителя нужного уровня.
Уникальный %Name помогает внутри области Owner, но не является глобальным поиском службы. /root/SessionState — явный контракт автозагрузки, а не образец пути, который нужно размножить по всем локальным компонентам.
Не смешивать три вида владения
Parent задаёт иерархию и освобождение детей при удалении родителя. Owner определяет принадлежность сохраняемому PackedEntity. Ответственность за игровую операцию — ваше архитектурное решение, а не дополнительное свойство Entity.
После RemoveChild native-объект остаётся живым. RetainedLevelHost показывает явного владельца отсоединённых корней и освобождает неактивные комнаты при выходе. Если просто убрать Parent и забыть объект, структура уровня больше не обеспечит его удаление.
Проверка до расширения проекта
Запустите префаб отдельно, создайте два экземпляра, удалите один, переместите локальный ребёнок, смените уровень и верните отсоединённый интерфейс. Проверьте, что второй экземпляр не зависит от полей первого, внешний сигнал не удерживает удалённый HUD, а _Ready не используется как единственный механизм повторной подписки.
Для исполняемых образцов используйте групповой компонент, сессию и HUD, жизненный цикл и поиск в области Owner. Проверки связывают эти границы с реальными объектами, а не только с диаграммой папок.