Добавить в корзинуПозвонить
Найти в Дзене
QuTeam

Свой движок для браузерной MMORPG — почему я не пошёл по простому пути

Когда люди узнают, что я пишу движок для игры сам, обычно следует один и тот же вопрос: зачем? Есть Unity, есть Godot, есть куча готовых решений. Зачем изобретать велосипед? Честный ответ: потому что было интересно. Не потому что готовые движки плохие. Не потому что я хотел доказать что-то себе или кому-то. Просто когда начинал думать про «Эхо: Сектор 0», мысль написать всё самому казалась не безумием, а частью удовольствия. Разобраться как это устроено изнутри. Сделать именно под свою игру, а не подстраивать игру под чужой инструмент. Движок написан на TypeScript. Клиент — браузерное приложение на React, Vite и PixiJS: React отвечает за интерфейс, PixiJS рисует игровую сцену. Сервер — Node.js, Express, Socket.IO и SQLite. Если совсем просто: браузер показывает игру, а сервер решает, что в ней на самом деле произошло. Архитектура классическая для браузерной онлайн-игры: клиент только отображает происходящее и отправляет действия игрока, а сервер — источник правды. Он хранит состояние м
Оглавление

Когда люди узнают, что я пишу движок для игры сам, обычно следует один и тот же вопрос: зачем? Есть Unity, есть Godot, есть куча готовых решений. Зачем изобретать велосипед?

Честный ответ: потому что было интересно.

Не потому что готовые движки плохие. Не потому что я хотел доказать что-то себе или кому-то. Просто когда начинал думать про «Эхо: Сектор 0», мысль написать всё самому казалась не безумием, а частью удовольствия. Разобраться как это устроено изнутри. Сделать именно под свою игру, а не подстраивать игру под чужой инструмент.

Что внутри

Движок написан на TypeScript. Клиент — браузерное приложение на React, Vite и PixiJS: React отвечает за интерфейс, PixiJS рисует игровую сцену. Сервер — Node.js, Express, Socket.IO и SQLite.

Один из внутренних инструментов движка: редактор монстров. Здесь настраиваются модель, характеристики, атаки, лут и поведение существа.
Один из внутренних инструментов движка: редактор монстров. Здесь настраиваются модель, характеристики, атаки, лут и поведение существа.

Если совсем просто: браузер показывает игру, а сервер решает, что в ней на самом деле произошло.

Архитектура классическая для браузерной онлайн-игры: клиент только отображает происходящее и отправляет действия игрока, а сервер — источник правды. Он хранит состояние мира, проверяет каждое действие и рассылает изменения всем участникам. Клиенту не доверяется ничего критичного.

Синхронизация между игроками работает через ревизии состояния и патчи — сервер не шлёт весь мир заново каждый раз, а отправляет только то, что изменилось. Если клиент отстал, сервер может отдать ему полный актуальный снимок. Это держит всех игроков в одном состоянии без лишней нагрузки.

Где было больно

Самым сложным оказался не сам факт написания движка, а доведение всех систем до согласованности.

Самое неприятное — когда визуально персонаж стоит в одном месте, а по логике сервера он уже в другом. На экране это выглядит как мелочь, но внутри приходится разбирать сразу несколько слоёв: координаты, анимацию, состояние боя и сетевую синхронизацию. В готовом движке всё это спрятано внутри и работает само. Когда пишешь своё — разбираешься в каждом слое вручную.

Но в этом и плюс: я теперь точно знаю, как устроена каждая часть игры. И могу сделать систему именно под «Эхо: Сектор 0», а не под абстрактный универсальный случай.

Момент, когда стало понятно что фундамент живой

Точное количество часов я не считал, но это уже точно сотни часов за пять-шесть месяцев. Не в формате full-time студии, а параллельно с основной работой, чаще всего в выходные. Активная история разработки началась в ноябре 2025-го. Звучит скромно, но когда складываешь всё вместе — понимаешь, что объём уже приличный.

Был момент, который я хорошо помню. Клиент отправил действие, сервер его принял, изменил состояние боя и отправил обновление обратно. Всё сработало. Не идеально, потом всплыли нюансы — рассинхрон, порядок событий, задержки. Так всегда бывает. Но базовый принцип подтвердился: клиент рисует и отправляет намерения, сервер считает и возвращает результат.

Это был тихий, но важный момент. Фундамент живой. На этом можно строить дальше.

Мысль «зря не взял Unity» так и не появилась. Да, готовый движок снял бы часть технической боли. Но вместе с этим я потерял бы главное — понимание, как моя игра устроена изнутри. А для «Эхо: Сектор 0» это оказалось важнее скорости.

В следующей статье расскажу про арт — как выглядит мир «Эхо: Сектор 0» визуально и как я его рисую.

А у вас был когда-нибудь проект, где вы намеренно выбрали сложный путь просто потому что было интересно разобраться? Напишите в комментариях — таких людей среди геймеров, мне кажется, немало.