Перейти к содержанию

Игровой бой на NukeECS

Категория: feature. Бой и управление танком обрабатываются системами NukeECS. LocationCombatSystem владеет одним ECS-миром локации и подключает авторские ссылки. GunCombatSystem, EnemyTarget, GunProjectile и PlaceholderTankMovement служат представлениями и конфигурацией; собственного игрового Update у них нет.

Игровой цикл

  • WASD, стрелки, геймпад и виртуальный джойстик управляют танком относительно камеры.
  • Пушка сама выбирает ближайшего живого видимого врага в радиусе 12 м.
  • Сохранены поворот 180°/с, интервал 0,7 с, урон 25, скорость снаряда 18 м/с, время жизни 3 с и пул 16 экземпляров.
  • Луч проверяет весь пройденный за кадр отрезок. Препятствие поглощает снаряд; другой враг может перехватить его и получить урон. При смерти исходной цели летящий к ней снаряд возвращается в пул.
  • У танка 100 HP. Ближняя атака противников уменьшает его здоровье. При нуле движение и стрельба прекращаются, через 3 игровых секунды танк возвращается в стартовую точку, противники восстанавливаются, снаряды сбрасываются.
  • Противники реагируют на танк в пределах 16 м. Подвижные враги приближаются по прямой, с проверкой препятствия; атака требует свободной линии до танка. Это базовый бой заглушек, без поиска пути и специальных способностей.
  • Погибший враг отключается и появляется на исходном месте через 8 игровых секунд.
  • Полоски HP — вложенный конкретный prefab CombatHealthBar; ECS обновляет масштаб заполнения при изменении здоровья и поворачивает полоску к камере.
  • В первой сцене подключены 26 обычных врагов и три босса. Четыре прежние скрытые капсулы не участвуют в её бою. Остальные локации наследуют бой своих четырёх капсул от общего LocationRoot.
  • Граница движения расширена с ±9 до ±90 м, чтобы можно было добраться до дальних групп. Полная проходимость города и физическое ограничение движения танка стенами не реализованы.
Префаб A01 HP Скорость, м/с Урон
E1 100 1,2 10
E2 160 1,6 12
E3 200 1 15
E4 140 0 12
B1 400 0,8 20
B2 600 1,2 25
B3 800 0 30

Состояние и жизненный цикл

Здоровье, таймеры, цель, параметры атаки и состояние снарядов находятся в unmanaged-компонентах. Unity-ссылки находятся в ресурсе CombatViews, принадлежащем миру. Системы запускаются на Threads.Main, поскольку используют Input System, Transform, Unity Physics и представления. В игровом Update нет временных массивов, LINQ, замыканий или создаваемых объектов; пул и массивы создаются один раз при установке мира. Все runtime-объекты создаются из конкретных prefab, без построения иерархий или поиска объектов.

Мир создаётся при включении локации и освобождается при отключении/уничтожении. Перед Play Mode выполняется stateless-сброс реестров пакета. Это требуется для установленных настроек DisableDomainReload, DisableSceneReload: в журнале был обнаружен запуск с уже освобождённым ComponentTypeMap. Сам пакет NukeECS не изменялся.

Scope audit

Изменения established/core:

  • GunCombatSystem.cs: прежний Update и состояние стрельбы заменены ECS-конфигурацией; параллельный MonoBehaviour-бой нарушал бы требование единой ECS-логики.
  • GunProjectile.cs: убраны самостоятельные полёт и урон, чтобы снаряд имел единственный ECS-источник состояния.
  • EnemyTarget.cs: здоровье читается из ECS, параметры врага и ссылки остаются сериализованными.
  • LocationCombatSystem.cs: создание, регистрация систем, сущностей и освобождение мира вместо привязки массива целей.
  • Flow/PlaceholderTankMovement.cs: движение передано ECS при сохранении существующих ссылок тела/камеры и параметров управления.
  • CombatSystems.cs: новая логика движения, боя, здоровья и восстановления.

Prefab и сцена изменены через подключённый Unity Pipeline. Существовавшие до задачи несвязанные изменения пользователя сохранены. Экипировка, навигация, сохранения, UI-поток и логика наград этой задачей не изменяются. Интеграция стрельбы со сменой экипированного оружия остаётся вне текущего стартового боя.

Техническая проверка

Подключённый Editor выполняет компиляцию без ошибок. Структурная проверка первой сцены подтвердила 29 подключённых активных целей с включёнными hitCollider и ссылками полосок HP, явную ссылку движения/камеры, границу 90 и доступность ближайших целей для луча от дула. Все двадцать prefab-вариантов локаций наследуют корректные ссылки танка, движения, камеры, пушки, снаряда и полоски HP. Коллайдер снаряда отключён; столкновения рассчитываются системой. Console не очищалась: содержит исторические ошибки компиляции, миграции LightSide и упомянутую ошибку реестра ECS. Эти проверки не подтверждают игровую приёмку.

Ручная приёмка — всё не проверено

  • [ ] Запустить Boot: одна сцена локации, один танк, камера и постоянный UI; видны стартовая пушка и полоски HP.
  • [ ] Проверить WASD/стрелки, геймпад и джойстик: движение относительно камеры, скорость 4 м/с, нормализация диагонали, прежний поворот корпуса и независимое наведение пушки.
  • [ ] Одиночная неподвижная открытая цель: выстрел после наведения, интервал не меньше 0,7 с, прямой полёт 18 м/с, урон 25; враг E1 умирает после четырёх попаданий.
  • [ ] За пределами 12 м или за препятствием выстрелов по цели нет; при смене ближайшей цели башня наводится на неё.
  • [ ] Препятствие поглощает снаряд; перехвативший снаряд враг получает урон; смерть исходной цели возвращает её снаряды в пул без повторного урона.
  • [ ] Урон уменьшает красную полоску; мёртвые цели не атакуют и не выбираются; восстановление через 8 игровых секунд возвращает максимальное HP и исходную позицию.
  • [ ] Приближение врагов и их атаки уменьшают зелёную полоску танка; при нуле движение/стрельба останавливаются; через 3 секунды бой восстанавливается без старых снарядов.
  • [ ] Открыть карту/меню/инвентарь: движение, наведение, полёт, урон и таймеры восстановления заморожены. Закрытие продолжает ту же сцену и бой.
  • [ ] Пройти к дальним группам и трём боссам первой локации; проверить читаемость полосок HP в портретном Game View.
  • [ ] Перейти в другую локацию и обратно: старый ECS-мир и снаряды освобождены; один танк/камера/UI; сохранённая локация загружается после перезапуска.
  • [ ] Дважды запустить и остановить Play Mode с текущими отключёнными Domain/Scene Reload: нет ObjectDisposedException, повторного мира или дополнительных снарядов.

Изменения игрового поведения остаются непроверенными до ручной приёмки.