Демонстрационная 2D MMORPG игра "Игорь" (клиент) проекта http://mmogick.ru/ на Unity.
Смотрите так же Игорь - серверная часть.
Демо тут
Unity 2021.3.0f1 (LTS). Клиент для 2D MMO RPG сервера.
Весь код находится в Assets/Scripts/:
| Папка | Назначение |
|---|---|
Controller/ |
Контроллеры игровой логики (камера, игрок, заклинания, UI, таргетинг) |
Model/ |
Модели сущностей (Player, Enemy, Object) |
Struct/ |
Структуры данных для обмена с сервером (Recive/Response) |
Classes/ |
UI-классы |
Всё остальное в Assets/ — UI-интерфейс, спрайты, анимации и ресурсы отображения. В перспективе анимации и карты будут загружаться с сервера при старте клиента (аналогично тому, как уже загружается тайлмап).
В Assets/Plugins/Mmogick/Client/Controller/BaseController.cs задаются:
GAME_ID— ID вашего проекта в личном кабинете http://mmogick.ru/ (раздел Игры)SERVER— адрес сервера по умолчанию (можно переопределить через UI при авторизации)
Форма авторизации (RegisterScene) содержит поля: сервер, логин, пароль. Адрес сервера предзаполняется из SERVER, но может быть изменён пользователем.
API маршруты:
POST /api/game/{gameId}/register— регистрация (login, password в теле запроса)POST /api/game/{gameId}/auth— авторизация (login, password в теле запроса)GET /maps2d/patch/get_map/{mapId}/{token}— получение данных карты
Сервер возвращает host (адрес WebSocket), key, token — после чего клиент подключается по WebSocket к игровой карте.
При разработке C# структур для десериализации серверных данных — использовать типы данных и имена полей как они приходят с сервера (PHP). Не подгонять сервер под клиент. Типы: если сервер отдаёт bool (true/false) — в C# использовать bool, а не int (0/1). Имена: slug компонентов, событий, групп событий, ключи JSON, имена полей в C# структурах должны точно совпадать с серверными. При анализе несовпадений — сверять с серверным кодом (файлы Build/Game/storage/ и БД) и искать похожие варианты написания (hpmax vs hp_max vs maxHp).
Assets\Plugins - плагины для работы с игры Unity с: фокусом WebGl, страницы отладки на странцие http://mmogick.ru/api, websocket в тч webgl и др описанные в этой папке отдельно
Assets\Plugins\GitIntegration - плагины интеграции с Git по статье https://habr.com/ru/post/493488/
Assets\Plugins\Joystick Pack - джойстик ttps://assetstore.unity.com/packages/tools/input-management/joystick-pack-107631
Assets\Plugins\SharpZipLib - плагин распаковки игровых карт (http://mmogick.ru/articles/frontend/index/eyJpZCI6MTd9) которые приходят с сервера
Assets\Plugins\Startup - добалвяет сцену RegisterScene и MainScene в настрйоки сборки билда + может подтягивать доп плагины из unity (не обязателен в проекте)
Assets\Plugins\WebGLSupport - набор плагинов нужных в сборке WebGl для: работы фокуса текстовых полей, изменение размера окна, Websocket соединения (в браузере), работы с отладкой в админ панели (http://mmogick.ru/articles/frontend/index/eyJpZCI6MjB9)
Assets\Plugins\WebsocketSharp - скомпилирвоанный плагин (https://github.com/sta/websocket-sharp) для Websocket соединения (в мобильных устройствах и ПК)
Assets\Plugins\MyFantasy - плагин для интеграции с онлайн-сервером http://mmogick.ru/articles/frontend/index/eyJpZCI6M30=
Assets\Plugins\MyFantasy\Model - базовые классы моделей (PlayerModel.cs, EnemyModel.cs, ObjectModel.cs) которые изменяют анимацию в клиенте в зависимости от того что за стандартные данные (например координаты) пришли
Assets\Plugins\MyFantasy\Protocol - содержит классы что создают WebSocket класс (для браузера и ПК с мобилками он разный) и вешают на него обработчики
Assets\Plugins\MyFantasy\Scripts\Controller - игровые классы
BaseController.cs - базовый класс от которого наследуются RegisterController.cs и ConnectController.csю содержит адрес сервера и общий метод для управления фокусов в WebGl и http запросов
ConnectController.cs - создает инициализирует вызрв класса WebSocket, обрабатыавет пакеты с игровым миром и шлет данные дальше в модели через метод SetData
Assets\Plugins\MyFantasy\Struct - описание структур запросов и ответов от сервера
Map\ - описание стрктур на которые разбивается декодированная карта с сервера
Recive\ - описание структур полученных от сервера данных (это базовые полученыне пакеты которые не зависят от компонтентов и механик в админке, например карты, авторизация и тд)
Response\ - описание структур отправляемых на сервер данных (это базовые запросы которые не зависят от компонтентов и механик в админке, например для движения)
Assets\Resources - папка с графикой и префабами (пока у сервера нет функционала загрузки и работы с графикой и анимацией что бы хранить ее на сервере)
Assets\WebGLTemplates - содержит шаблон WebGl для работы панели отладки (http://mmogick.ru/articles/frontend/index/eyJpZCI6MjB9) - отличается от стандартного наличием дополнительного JavaScript кода
Assets\Scenes - содержит сцену входа/регистрации и сцену игры. тк все даныне карт и инфомрация о объектах содержится на сервере - то сцена пуста, ее заполняет Assets\Scripts\Controller\ConnectController
Assets\Scripts\Model - классы моделей префабов (унаследованных от PlayerModel.cs, EnemyModel.cs, ObjectModel.cs) которые изменяют анимацию в клиенте в зависимости от того что за данные пришли (в частности компоненты)
Assets\Scripts\Struct - описание структур запросов и ответов от сервера
Recive\ - стуктуры что нужно переопределить в плагине (в частности это стукруты игроков, монстров и объектов и их пользовательские поля (http://mmogick.ru/articles/frontend/index/eyJpZCI6MTl9))
Response\ - структуры игровых механик (команд что отправляются с клиента) с данными что ожидает сервер (настраиваются в личном кабинете сервера http://mmogick.ru/articles/frontend/index/eyJpZCI6MTh9)
Assets\Scripts\Controller - игровые классы
CameraController.cs - изменение размер отдаления камеры для разного масштаба
PlayerController.cs - класc обрабатывает что нажал игрок и что надо отправлять на сервер, наследуется от ConnectController
RegisterController.cs - класс обработчик сцены входа и регистрации в игру , после загружает сцену Main и передает управление PlayerController.cs
Для разработки непосредственно вашей игры вам работать в папке Assets/Scripts, подробнее в документации на сайте
PS NewTonJson выбран взамен стандартного UnityJson для работы со структурами не просто так, менять его на UnityJson - на свой страх и риск
PS для webgl может понадобиться отключить profiling в Built Settings тк забьется память браузера в console после прихода по websocket большого количества пакетов
Игра одинаково хорошо взаимодействует с сервером в версиях для ПК, браузеров или мобильных устройств
Unity Editor запущен на Windows, проект (C:\Unity\release) — в файловой системе Windows, доступен из WSL как /mnt/c/Unity/release. При работе через WSL Claude Code читает/пишет файлы через /mnt/c/, но Unity компилирует и запускает их на Windows-стороне.
Фичи реализуются последовательно в /mnt/c/Unity/release:
- Определить что нового в очередном уроке — сравнить содержимое папки урока с предыдущим уроком
- Понять как новая механика взаимодействует с сервером — посмотреть текущий код sandbox (
/var/www/html/game/Build/Sandbox/storage) и существующие механики/компоненты (/var/www/html/game/Build/Game/storage) - Реализовать фичу в
/mnt/c/Unity/releaseс учётом того, как устроен текущий клиент - Документировать реализацию (описание механики, взаимодействие клиент-сервер) в
/var/www/html/lessons/README.MDс пометкой номера урока (lesson)
При разработке новой фичи — обязательно смотреть как была реализована предыдущая, чтобы сохранить единообразие подхода.
Установить расширение VS Code - C# Dev Kit Установить расширение VS Code - Unity for Visual Studio Code (автодополнение Unity API, подсветка .shader/.asmdef)
В Unity Editor: Edit → Preferences → External Tools → External Script Editor — выбрать VS Code. Unity сгенерирует .sln и .csproj файлы — автодополнение, навигация по коду заработают.
Если работа ведётся только с Unity-клиентом без серверной части (PHP) — WSL не требуется.
VS Code открывается на Windows напрямую (C:\Unity\release), все расширения и отладка работают нативно без ограничений.
Для работы C# Dev Kit в WSL необходим .NET SDK. Установка:
- Добавить репозиторий Microsoft: wget https://packages.microsoft.com/config/ubuntu/24.04/packages-microsoft-prod.deb -O /tmp/packages-microsoft-prod.deb sudo dpkg -i /tmp/packages-microsoft-prod.deb && rm /tmp/packages-microsoft-prod.deb sudo apt-get update
- Установить SDK: sudo apt-get install -y dotnet-sdk-8.0
