Игра похожа на настольную: все полностью пошаговое, и у каждого игрока есть своя карта. Между игроками нет взаимодействия в реальном времени, нет проверок столкновений и нет синхронизации действий между ходами.
Чтобы удовлетворить мои требования к детерминированности и простоте разработки, на данный момент я структурировал проект следующим образом:
Код: Выделить всё
Project Root
├─ Client (Unity project)
├─ Shared (pure C# classes, no Unity or server-specific dependencies)
└─ Server (ASP.NET)
После исследования я составил краткий список технических требований:
- Все структуры данных должны быть на чистом C# и полностью сериализуемы в JSON — никаких специфичных для Unity типов, никаких атрибутов [Serializable].
- Общие файлы — единственный источник достоверной информации: ActionExecutionChain, GameEntityDatabase, ModifierDatabase и т. д.
- Сервер является авторитетным: он проверяет ActionExecutionChain, обеспечивает соблюдение правил и не обрабатывает логику пользовательского интерфейса.
- Дескрипторы клиента Пользовательский интерфейс и моделирование; он генерирует ActionExecutionChain для проверки сервера.
- Модификаторы и игровая логика существуют в виде чистых данных в общих файлах; логика времени выполнения (подсказки, расчеты) выполняется только на стороне клиента.
- Все расчеты должны воспроизводиться как на сервере, так и на клиенте без зависимостей Unity.
- Нет дублирования: все игровые правила, объекты и модификаторы определяются только один раз на общем уровне.
- Все объекты и игровая логика должны сохраняться и исполняемый на как сервере, так и на клиенте Unity.
- Хороший ли это подход для пошагового детерминированного автобитвы? Существуют ли существующие проекты, шаблоны или примеры, на которых я мог бы поучиться? Сделали бы вы что-нибудь по-другому в моем конкретном сценарии?
- Прав ли я, предполагая, что я не могу использовать [Serializable] для общих классов? Нужно ли мне избегать динамической типизации, использования определенных словарей и типов, специфичных для Unity, чтобы поддерживать полностью разделяемое состояние между Unity и сервером?
Кроме того, на сервере в конечном итоге потребуется разместить базу данных, содержащую все данные игроков, включая:
- рейтинги ELO
- Бой история
- Сами данные боя (для реконструкции и представления противников-призраков)
Спасибо всем за то, что прочитали все это, хорошего дня!