Skip to content

Whaledevelop/DesperateMinds

Repository files navigation

Desperate Minds

Прототип пошаговой тактической игры на квадратной сетке. Игрок проходит выбор команд, попадает на уровень, выбирает персонажей и способности, перемещается по сетке и выполняет действия в порядке инициативы.

Проект находится в активной разработке. Основная игровая сцена сейчас использует уровень Office, две команды персонажей, очки действий, поиск пути, зоны перемещения, удар в ближнем бою и два режима камеры.

Быстрый старт

Требуемая версия редактора: Unity 6000.4.11f1.

  1. Откройте корень проекта через Unity Hub.
  2. Дождитесь импорта ассетов и компиляции скриптов.
  3. Откройте Assets/_game/Content/_Global/Game.unity.
  4. Запустите Play Mode.

Стандартный игровой flow:

Game -> Boot -> StartMenu -> Draft -> Core
Ошибка запуска любого состояния -> Error

Для быстрого запуска используется Tools -> Runner:

  • RushToCore формирует тестовые команды из DraftSettings и сразу открывает Core;
  • SpecifiedScene запускает выбранную сцену напрямую и предназначен для изолированной разработки; для полного flow выберите Game.unity.

Game.unity должна оставаться стартовой сценой для обычной игры. Остальные игровые сцены загружаются роутером аддитивно.

Управление в Core

  • ЛКМ — выбрать персонажа, клетку или цель;
  • WASD — перемещение free roam камеры;
  • Q / E — поворот камеры;
  • колесо мыши — приближение и отдаление;
  • кнопки способностей в HUD — выбор перемещения или атаки;
  • выбор персонажа переключает камеру в third person, если этот режим разрешен в CameraSettings.

Архитектура

Проект построен вокруг VContainer, игровых состояний и разделения runtime-логики на services, models, systems и views.

flowchart TD
    GameScene["Game.unity<br/>GameLifetimeScope"] --> Global["Глобальный scope"]
    Global --> Services["Services<br/>UI и общая инфраструктура"]
    Global --> Router["GameStateRouter"]
    Global --> Shared["SharedGameModelsContainer"]
    Router --> StateScene["Активная state-сцена<br/>Boot / StartMenu / Draft / Core / Error"]
    StateScene --> StateScope["State LifetimeScope"]
    StateScope --> Entry["StateEntryPoint"]
    StateScope --> Models["Models<br/>состояние и события"]
    StateScope --> Systems["Systems<br/>правила и реакции"]
    Systems --> Models
    Models --> ViewModels["ViewModels"]
    ViewModels --> Views["uGUI Views"]
    Shared --> StateScope
Loading

Глобальный scope

GameLifetimeScope живет в Game.unity всю игровую сессию. Он регистрирует:

  • GameStateRouter;
  • глобальные services;
  • глобальные models и systems;
  • общие настройки;
  • dispatchers Unity update-цикла, событий и actions;
  • SharedGameModelsContainer для данных, которые должны пережить смену state-сцены.

GameEntryPoint инициализирует глобальные services и systems, подключает update-системы к UpdatesDispatcher, затем открывает Boot либо сразу Core в режиме RushToCore.

Игровые состояния

Каждое состояние представлено отдельной сценой и отдельным LifetimeScope:

Состояние Ответственность
Boot Инициализация и экран загрузки
StartMenu Главное меню и вход в draft
Draft Выбор составов двух команд
Core Основной tactical gameplay
Error Fallback при ошибке загрузки или запуска состояния

GameStateRouter закрывает текущее состояние, загружает новую сцену аддитивно, назначает глобальный scope родителем state-scope и вызывает IStateEntryPoint. В сцене состояния должен быть ровно один корневой LifetimeScope.

Порядок входа в состояние:

  1. Инициализация models.
  2. Выполнение логики конкретного EntryPoint.
  3. Инициализация systems и регистрация update-интерфейсов.

При выходе порядок обратный: systems освобождаются в обратной последовательности, затем выполняется ExitPoint, после чего освобождаются models и выгружается сцена.

Models

Models содержат runtime-состояние, reactive values и доменные события. Они не зависят от конкретного UI и не управляют игровым поведением напрямую.

Примеры в Core:

  • CoreCharactersModel — персонажи, выбранный и активный персонаж, номер раунда;
  • CoreGridModel — runtime-сетка и найденные пути;
  • CoreInputModel — события кликов по персонажам, сетке и внешней области;
  • CoreCameraModel — активная камера и режим камеры;
  • CoreLevelsModel — текущий уровень.

DraftResultModel является shared model: выбранные в Draft команды доступны после перехода в Core.

Systems

Systems реализуют правила игры, подписываются на models и записывают результат обратно в models. Systems не должны вызывать друг друга напрямую: взаимодействие проходит через состояние, события и команды models.

Основные Core systems:

  • selection и обработка кликов;
  • очередность ходов по инициативе и восстановление очков действий;
  • построение пути и перемещение по сетке;
  • расчет занятых клеток и отображение доступной зоны;
  • выбор и выполнение способностей;
  • free roam и third person камеры;
  • рендер runtime-сетки и очереди персонажей.

System, реализующая IUpdate, ILateUpdate или IFixedUpdate, автоматически вызывается через UpdatesDispatcher, пока ее состояние активно.

Views и UI

Unity-компоненты используются как пассивные views с заранее сериализованными ссылками. View models подготавливают данные и команды для UI, а UGUIService создает экраны по UIViewCode из UGUISettings.

UGUIRoot создается один раз глобальным service и переживает смену state-сцен. Конкретные экраны открываются в EntryPoint и закрываются в ExitPoint.

Settings и игровой контент

Настройки хранятся в ScriptableObject, а ссылки на Unity-объекты задаются через Inspector. Главная точка конфигурации gameplay — CoreStateSettings, объединяющая настройки уровня, камеры и движения персонажей.

Уровень задается связкой:

  • LevelSettings — prefab уровня, grid data и spawn settings;
  • LevelGridData — сериализованное описание сетки;
  • LevelView — ссылки на геометрию и collider-поверхности;
  • SpawnSettings — позиции появления команд.

Персонаж описывается CharacterSettings: prefab, размер footprint, характеристики и доступные способности. Значения характеристик во время игры находятся в CharacterStatsModel.

Регистрация runtime-классов

Models, systems и services регистрируются через атрибуты:

[GameModel(nameof(GameStateCode.Core))]
public sealed class ExampleModel : GameModel<ExampleModel, IExampleModel>, IExampleModel
{
}

[GameSystem(nameof(GameStateCode.Core))]
public sealed class ExampleSystem : SyncLifetime, IGameSystem
{
}

[GameService]
public sealed class ExampleService : SyncLifetime, IService
{
}

После добавления или удаления такого класса откройте Whaledevelop -> ScriptsGenerator и выполните Generate Compositions.

Результат сохраняется в Assets/_game/Scripts/Generated. Эти файлы являются generated source of truth для VContainer-регистраций, их не следует редактировать вручную.

Структура проекта

Assets/
├── _game/
│   ├── Content/                 сцены, prefabs и ScriptableObject-настройки
│   │   ├── _Global/             постоянная Game-сцена и общие настройки
│   │   ├── Boot/
│   │   ├── StartMenu/
│   │   ├── Draft/
│   │   ├── Core/
│   │   └── Error/
│   ├── Scripts/
│   │   ├── _Global/             глобальный scope, state router, UI и shared data
│   │   ├── Boot/
│   │   ├── StartMenu/
│   │   ├── Draft/
│   │   ├── Core/                основной gameplay по доменным модулям
│   │   ├── Error/
│   │   ├── Editor/              Runner, генераторы и инструменты
│   │   ├── Generated/           автогенерируемые VContainer compositions
│   │   └── Utility/
│   └── Sandbox/                 изолированные эксперименты
├── _whaledevelop/               переиспользуемый framework-слой проекта
└── Plugins/                     сторонние runtime-плагины

Внутри Core код разделен по gameplay-доменам: Abilities, Camera, Characters, Grid, Input, Levels, Movement, Queue, Selection, Stats, Turn и UI.

Как знакомиться с кодом

Рекомендуемый маршрут чтения:

  1. GameLifetimeScope и GameEntryPoint — глобальная композиция и запуск.
  2. GameStateRouter — переходы между сценами и обработка ошибок.
  3. StateEntryPointBase и StateExitPointBase — lifecycle состояния.
  4. CoreLifetimeScope и CoreEntryPoint — сборка основного gameplay.
  5. CoreRuntimeDataComposition.Generated.cs — полный список Core models и systems.
  6. CoreCharactersModel, CoreCharacterTurnSystem и CoreCharacterMovementSystem — типичный путь данных через model и systems.
  7. CoreScreenViewModel и CoreScreenView — связь gameplay с UI.

Добавление функциональности

Для новой gameplay-механики:

  1. Поместите runtime-состояние и события в model соответствующего домена.
  2. Реализуйте правила в отдельной system, работающей с models через DI.
  3. Добавьте [GameModel] или [GameSystem] с нужным state-scope.
  4. Перегенерируйте compositions через Whaledevelop -> ScriptsGenerator.
  5. Вынесите настраиваемые значения в ScriptableObject settings.
  6. Добавьте view/view model только для отображения и пользовательских команд.
  7. Проверьте полный вход и выход из состояния, включая повторный переход.

Новый state требует GameStateCode, отдельной сцены с одним корневым LifetimeScope, пары IStateEntryPoint / IStateExitPoint, записи в GameStatesSettings и добавления сцены в Build Settings.

Основные зависимости

Технология Назначение
Unity 6 / URP Runtime и рендеринг
VContainer Dependency injection и lifetime scopes
UniTask Асинхронный lifecycle и переходы состояний
R3 Reactive state и подписки
Input System Gameplay и UI input
Cinemachine Управление игровыми камерами
DOTween Анимация перемещения и UI
Odin Inspector Настройки и editor tools

Список package-зависимостей Unity находится в Packages/manifest.json. Локальные и импортированные плагины перечислены в Assets/_whaledevelop/README.md.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors