#mopsicus: заметки с тегом nodejs https://mopsicus.ru/tags/nodejs/ об играх, разработке на Unity и личном опыте Игорь Лопатин ru E2 (v3572; Aegea) Игорь Лопатин об играх, разработке на Unity и личном опыте Shardy 267 https://mopsicus.ru/all/shardy/ Thu, 10 Oct 2024 22:33:59 +0300 Игорь Лопатин https://mopsicus.ru/all/shardy/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Shardy</h3><h4 style="display: none;" itemprop="description">Shardy</h4><img itemprop="contentUrl" src="https://mopsicus.ru/pictures/logo.png" width="512" height="512" alt="Shardy" /> </div> <p>Друзья, был у меня давно один проект, который претерпел уже наверное 4 или 5 итераций. Этой штукой я пользуюсь на своих пет-проектах и со временем появилось желание сделать из всего этого опенсорсную историю. Поэтому начну из далека :)</p> <p>Давным-давно был такой проект на гитхабе <a href="https://github.com/NetEase/pomelo">Pomelo</a>. По меркам интернета — реально древний, ему больше 10 лет. Он и сейчас там есть, но уже заархивирован и не поддерживается, но форки вроде пилятся. Кто первый раз слышит, это фреймворк для создания игровых серверов на JavaScript и Node.js. Проект довольно большой, куча модулей, клиенты под разные платформы, хорошая дока. Наткнулся я на него несколько лет назад и начал ковырять, запускать, что-то пробовать. В итоге, многие вещи в нём мне понравились, но показалось всё как-то замудрёно что ли. Наверно потому что китайцы писали, а может я в ноду не сильно мог 😅 В общем, оттуда я потягал какие-то скрипты, интересные решения, потом переписал, упростил и, получился у меня такой лайтовый сервер из нескольких файлов, на котором я тестил всякие свои проекты, изучал ноду, яваскрипт и тайпскрипт позднее.</p> <p>Потом решил поделиться своими поделками и выложить на гитхаб. Когда было свободное время что-то дописывал, переписывал и снова забывал, потому что были задачи поважнее. В какой-то момент, переписал всё на TypeScript (TS). К тому времени уже были наработки не только сервера, но и клиента на C# + Unity и всё это дело стало обретать какой-то полезный вид. И вот, в результате n-ой итерации, архитектура устоялась, протестировалась и получился Shardy.</p> <p><a href="https://github.com/mopsicus/shardy">Shardy</a> — это фреймворк для онлайн игр и приложений на Node.js. Он даёт базовую функциональность для построения микросервисных решений: мобильных, социальных, веб, многопользовательских игр, приложений реального времени, чатов, middleware сервисов и т. п. Есть клиент на TS встроенный в фреймворк, а также <a href="https://github.com/mopsicus/shardy-unity">пакет для Unity</a>, который поддерживает сборки под iOS, Android и WebGL. Здесь я говорю микросервисных потому что по задумке, за каждый модуль будет отвечать отдельный Shardy-сервис со своими командами, настройками, возможно БД.</p> <p>Основные фичи:</p> <ul> <li>микросервисная парадигма</li> <li>простой API: RPC, команды, подписки и т. п.</li> <li>транспорт данных через сокеты и вебсокеты</li> <li>легкость и быстрота: Node.js и TypeScript</li> <li>поддержка пользовательской сериализации</li> <li>поддержка пользовательской валидации рукопожатий (handshake)</li> <li>продвинутый логгер: теги, фильтры, области</li> <li>справочные материалы: документация, сниппеты, примеры</li> <li>почти нулевая конфигурация</li> </ul> <p>Есть демка с примерами работы API и простенькая онлайн игра «Крестики-Нолики»: как серверная часть, так и клиентская. Всё можно посмотреть, поковырять, запустить у себя и попробовать поиграть. Весь код старался комментировать, иногда даже излишне. Также есть <a href="https://github.com/mopsicus/shardy/blob/main/docs/index.md">документация</a> с описанием всех компонентов и методов. Это всё в процессе наполнения и улучшения.</p> <p>Основная цель Shardy — предоставить простое бесплатное решение для создания многопользовательских онлайн игр. Вот так вот громко 😅 На это будет обращено основное внимание при дальнейшей разработке новых функций, сервисов и туторов (было бы время...).</p> <p>Не претендую на академическую правильность архитектуры и кода, делал в первую очередь для своих нужд. Но как показал опыт: зачастую многие принципы ООП, чистого кода, использование паттернов в «нужных» местах, разбиваются об реальность конкретного проекта :)</p> <p>Приглашаю всех заинтересованных инди и не только, в подписчиках вроде такие есть, посмотреть, покрутить, примерить, потестить на своих каких-то задачах, играх, проектах, прототипах. Если будут вопросы, отвечу тут в комментах или на почту mail@mopsicus.ru. В личку тоже можно, но могу не заметить или долго отвечать.</p> <p>Вот такое интро. Всем хороших игр! Онлайн игр :)</p> <p><a href="https://github.com/mopsicus/shardy">Shardy</a><br /> <a href="https://github.com/mopsicus/shardy-unity">Shardy for Unity</a><br /> <a href="https://github.com/mopsicus/shardy/blob/main/docs/index.md">Docs</a></p> Игра «Камень, ножницы, бумага» 262 https://mopsicus.ru/all/kanobu-telegram-bot/ Wed, 14 Feb 2024 11:11:39 +0300 Игорь Лопатин https://mopsicus.ru/all/kanobu-telegram-bot/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Камень, ножницы, бумага</h3><h4 style="display: none;" itemprop="description">Камень, ножницы, бумага</h4><img itemprop="contentUrl" src="https://mopsicus.ru/pictures/kanobu.png" width="640" height="360" alt="Камень, ножницы, бумага" /> </div> <p>​​В качестве эксперимента запилил игру <a href="http://t.me/kanobu_play_bot" class="nu">«<u>Камень, ножницы, бумага</u>»</a> в телеграм боте. Можно играть и непосредственно в боте со случайным соперником (если такой будет :), и в чате с другом. Пишется стата, есть лидерборда. Минимальный набор, так сказать. Играть можно только онлайн, против бота поиграть не получится.</p> <p>Сама игра на Typescript и Telegraf.js. В общем, интересный опыт. Если будут какие-то вопросы по реализации, пишите в комменты, отвечу по возможности.</p> Unity Builder Bot 259 https://mopsicus.ru/all/telegram-bot-builder-unity/ Wed, 08 Jun 2022 20:12:33 +0300 Игорь Лопатин https://mopsicus.ru/all/telegram-bot-builder-unity/ <p>Бот сделан на основе моего старого скрипта из <a href="https://mopsicus.ru/all/custom-ci-cd-unity/">этой статьи</a>.</p> <p>Телеграм бот и расширение редактора для билда Unity проектов. Можно использовать по отдельности, но проектировалось чтобы работало вместе. Все исходники по ссылкам.</p> <div class="e2-text-picture"> <div class="fotorama" data-width="700" data-ratio="0.8816120906801"> <img src="https://mopsicus.ru/pictures/ubh.png" width="700" height="794" alt="Unity Builder Helper" /> <img src="https://mopsicus.ru/pictures/ubh-settings.png" width="700" height="794" alt="Unity Builder Helper settings" /> </div> </div> <p><a href="https://github.com/mopsicus/ubb">Телеграм бот</a> написан на Node.js и Telegraf.js. Может пулить апдейты, запускать билд юнити проекта, билдить Xcode проект (на маке), всё подписывать, загружать на сервер и скидывать ссылку. Билды для iOS тоже можно ставить по ссылке, там подключается манифест разработчика.</p> <p>Основные функции:</p> <ul> <li>добавить проект из Git репозитория</li> <li>удалить проект</li> <li>получить список всех проектов</li> <li>перейти в нужную ветку</li> <li>спулить апдейт</li> <li>сбилдить Unity проект</li> <li>сбилдить Xcode проект</li> <li>скомпилировать, сделать архив, экспорт в IPA</li> <li>сгенерировать HTML страницу с ссылками</li> <li>загрузить все файлы на сервер через sshpass</li> <li>получить логи</li> <li>очистить логи и билды</li> </ul> <p>Это все можно сделать с помощью телеграм, даже не запуская Unity. Каждый этап сборки логируется и уведомляется ботом.</p> <p><a href="https://github.com/mopsicus/ubh">Расширение редактора</a> позволяет быстро переключаться между платформами, включать дефайны, запускать локальный и удаленный билд на боте, подставлять данные для Keystore, нужные зависимости для Huawei, добавлять локализации для iOS, также добавлять сторонние файлы в билд. Есть <a href="https://github.com/mopsicus/ubh-demo">демка</a> с набором файлов и примерной структурой.</p> <p>Основные функции:</p> <ul> <li>изменить платформу</li> <li>установить defines</li> <li>выбрать папку для билдов под каждую платформу</li> <li>изменить версию, номер билда</li> <li>подставить данные для Keystore</li> <li>добавить локали и *.lproj файлы в Xcode проект</li> <li>добавить фреймворки и дополнительные файлы в Xcode проект</li> <li>добавить и применить google-services.json и agconnect-services.json</li> <li>добавить дополнительные файлы в APK</li> <li>пропатчить AndroidManifest.xml</li> <li>пропатчить gradle файлы</li> <li>добавить зависимости для Huawei билда</li> <li>сбилдить Unity проект</li> </ul> <p>Получилось как-то так, думаю кому-то будет полезно и интересно поковырять исходники. Подписывайтесь на <a href="https://t.me/mopsicus_ru">Telegram канал</a>, там посты появляются чаще %)</p> Сервер на Node.js и клиент на Unity 164 https://mopsicus.ru/all/node-js-game-server-unity-client/ Wed, 08 May 2019 13:01:41 +0300 Игорь Лопатин https://mopsicus.ru/all/node-js-game-server-unity-client/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name"></h3><h4 style="display: none;" itemprop="description"></h4><img itemprop="contentUrl" src="https://mopsicus.ru/pictures/nodejs-server-unity-client.jpg" width="515" height="222" alt="" /> </div> <p>Задумал я тут выложить на Github свою очередную поделку — простой сервер на Node.js и клиента к нему на Unity. Много раз сам гуглил различные библиотеки, пробовал, тестировал, пытался сам написать что-то (с моими познаниями в Node.js :), но потом подсмотрел как сделано у старого китайского <a href="https://github.com/NetEase/pomelo">Pomelo</a>, который уже сто лет не поддерживается.</p> <p>Если честно, когда я первый раз узнал про Pomelo и начал его изучать, то понял, что для моих текущих задач такой функциональности не требуется, поэтому решил выпилить всё что не нужно. В итоге, осталось вот что:</p> <p class="note">Опыта в Node.js у меня не очень много, поэтому я нагуглил такой фреймворк — Architect. Не знаю насколько это оправдано, но пока сделано с помощью него.</p> <ul> <li>многопользовательский сервер для <b>не</b>реалтаймовых игр</li> <li>отправка и получение команд и запросов (аналог JSON RPC)</li> <li>поддержка SSL</li> <li>основная часть на <a href="https://github.com/c9/architect">Architect</a></li> <li>простое добавление команд: один файл = одна команда</li> <li>работает с MongoDB</li> </ul> <h2>Команды (события)</h2> <pre class="e2-text-code"><code class="">public void TestCommand () { JsonObject param = new JsonObject(); param[&quot;param&quot;] = &quot;value&quot;; _connector.Command(&quot;test-cmd&quot;, param); // _connector.Command(&quot;test-cmd&quot;); // without params }</code></pre><p>Чтобы «слушать» команды с сервера надо подписаться на команду (событие):</p> <pre class="e2-text-code"><code class="">public void TestCommand () { _connector.On(&quot;test-cmd&quot;, OnTestCmd); // _connector.Off(&quot;test-cmd&quot;, OnTestCmd); // unsubscribe } void OnTestCmd (JsonObject result) { if (_connector.IsError (result)) { // handle error return; } // handle result }</code></pre><h2>Запросы (RPC)</h2> <pre class="e2-text-code"><code class="">public void TestRequest () { JsonObject param = new JsonObject(); param[&quot;param&quot;] = &quot;value&quot;; _connector.Request (&quot;test-rqt&quot;, param, (result) =&gt; { // handle answer }); // _connector.Request (&quot;test-rqt&quot;, OnTestRequest); // without params // _connector.Request (&quot;test-rqt&quot;, param, OnTestRequest); // callback in external method } void OnTestRequest (JsonObject result) { if (_connector.IsError (result)) { // handle error return; } // handle result }</code></pre><p>На RPC запросы с сервера можно подписаться также как и на обычные команды. Отличие в том, на них надо обязательно «отвечать».</p> <p>На сервере каждая команда находится в отдельном файле и экспортируется, как-то так:</p> <pre class="e2-text-code"><code class="">module.exports = function (commander, message, imports) { if (!validate(message.data, commander.protocol.log)) { commander.sendError(message, &quot;invalid_data&quot;); return; } ... commander.sendResponse(message, { result: &quot;ok&quot; }); };</code></pre><p>Протокол сообщений можно легко переделать, добавить шифрование или свой какой-то формат, можно посмотреть в репе Pomelo, у меня будет также примерно.</p> <p>Для создания простой многопользовательской онлайн игры — этого достаточно. Это будет такая демка, когда можно взять сервер и клиент, запустить и сразу увидеть как оно работает. Код будет полностью доступен, так что умеющие в Node.js и C#, смогут переписать мои «костыли» на свои :)</p> <p>После тестирования и «боевой» проверки на игре, если всё получится, думаю сделать небольшой курс, где опишу, как на основе такой базы делать несложные онлайн игры. Но замечу ещё раз — НЕ реалтайм!</p> <p>Stay tuned.</p> Движки онлайн игр на Node.js 83 https://mopsicus.ru/all/online-game-server-node-js-list/ Thu, 07 Dec 2017 15:41:39 +0300 Игорь Лопатин https://mopsicus.ru/all/online-game-server-node-js-list/ <p>Когда читаешь форумы и паблики по Unity, часто встречаются вопросы/ответы: как сделать онлайн игру, как сделать мультиплеер, что лучше unet, photon, etc. И часто люди советуют друг другу, как раз решение от самой Unity — <a href="https://docs.unity3d.com/Manual/UNet.html">UNet</a> или другой вариант — <a href="https://www.photonengine.com">Photon</a>.</p> <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name"></h3><h4 style="display: none;" itemprop="description"></h4><img itemprop="contentUrl" src="https://mopsicus.ru/pictures/gamepad.png" width="512" height="512" alt="" /> </div> <p>Что с одной стороны понять можно — есть документация, примеры, готовый мультиплеер и матчмейкинг, не нужен свой сервер и т. д. Только за это надо платить, когда сервер не твой, то нет полного контроля и гибкости + на тарифе Unity Pro — лимит <i>всего 200</i> игроков онлайн! У Photon тоже есть ограничения и тоже платная подписная модель. Поэтому если есть вероятность, что игра выстрелит (все же на это надеются :), стоит задуматься о собственном сервере.</p> <p>Много плюсов в сторону своего сервера и движка. Минимум — это дешевле и есть полный контроль. Из минусов — всё надо настраивать и писать самому. Ну почти всё... Для одинокого разработчика, это может стать проблемой, тем более если нет опыта серверной разработки.</p> <h2>Вариант №1</h2> <p>Можно заморочиться, написать клиент и сервер на Unity с использованием UNet и запустить его на <a href="https://noobtuts.com/unity/unet-server-hosting">своём сервере в режиме <b>Headless Mode</b></a>. Не пробовал, не знаю.</p> <h2>Вариант №2</h2> <p>Написать свой онлайн движок. Или использовать чей-то.<br /> Тут есть место где развернуться, есть много серверных языков и фреймворков. Есть и готовые движки для онлайн игр и ничто не мешает их использовать вместе с Unity. Я рассматривал только Node.js, потому что имел с ним дело и могу разобраться, но уверен, есть и другие, на других языках.</p> <p>Вот список из нескольких проектов, которые можно взять на изучение и даже что-нибудь на них запустить.</p> <h2><a href="https://github.com/NetEase/pomelo">Pomelo</a></h2> <p>В Google он найдется одним из первых. Написан китайцами, давно не поддерживается и заброшен. Достаточно наворочен и имеет хорошую подробную документацию и примеры, можно расширять плагинами, вообще стоит посмотреть на его архитектуру. Есть готовый клиент для Unity и других платформ.</p> <h2><a href="https://github.com/gamestdio/colyseus">Colyseus</a></h2> <p>Этот движок обновляется, последний апдейт был пару недель назад. Позиционируется как движок для HTML5 игр. Работает через вебсокеты, данные сжимаются msgpack, есть встроенный матчмейкинг и компенсация лагов. Хорошая документация и примеры. Есть официальные клиенты на JS, Unity и CoronaSDK.</p> <h2><a href="https://github.com/lance-gg/Lance">Lance</a></h2> <p>Уже полгода не обновлялся. Также работает на вебсокетах, есть сжатие, компенсация лагов, предсказание и т. д. Пишут, что подходит для любых игр и жанров. Есть документация и пару примеров на JS.</p> <p>Для начинающих можно ещё посмотреть эти два репозитория:<br /> <a href="https://github.com/bonsaiden/maple.js">https://github.com/bonsaiden/maple.js</a><br /> <a href="https://github.com/huytd/node-js-game-server">https://github.com/huytd/node-js-game-server</a></p> <p>Если ещё погуглить, можно найти много примеров на Socket.IO, но мне он почему-то не понравился. Хотя сделать на нём простое онлайн взаимодействие вполне легко.</p>