#mopsicus https://www.mopsicus.ru/ об играх, разработке на Unity и личном опыте Игорь Лопатин ru E2 (v3572; Aegea) Игорь Лопатин об играх, разработке на Unity и личном опыте 2024 год 271 https://www.mopsicus.ru/all/2024-year/ Fri, 27 Dec 2024 11:14:53 +0300 Игорь Лопатин https://www.mopsicus.ru/all/2024-year/ <p>В этом году было всего 8 заметок, вместе с этой 9 😅 Из которых 3 — в декабре. В новом году ухожу с Эгеи...</p> <p>Перевёл все свои заметки и базу знаний в Обсидиан. Оказался удобным, даже с минимумом плагинов. Когда была волна переездов с Ноушена видел статьи как можно обмазаться кучей плагинов и будет почти также, но сам использую только основные. Ещё использую официальный вебклиппер, даже <a href="https://github.com/obsidianmd/obsidian-clipper/commit/13f49fc538041d3399c6afc85ccde4b2283aecc4">запушил</a> русскую локализацию :)</p> <p>И мне понравилась эта идея хранить всё в отдельных файлах, а не в БД, что я решил перевести сайт и блог на такой же формат. Возьму какой-нибудь генератор статичных сайтов или напишу свой, для разминки 🙄 Эгея хороший движок, но все-таки исключительно бложный, который ограничивает многие моменты, да и последние интересные функции платные. Так что, волевым решением, сделаю себе новый сайт и блог, переведу всё на маркдаун файлы и хтмльки, обновлю некоторые заметки которые устарели.</p> <p>Выпустили <a href="https://mopsicus.ru/all/sea-battle-online-game/">Морской Бой</a>. Пока метрики так себе, ожидали немного другого :)) В новом году будет минимум две большие обновы. Ещё в разработке две новые карточные игры, о них как-нибудь расскажу. В начале года выпустил игру <a href="https://mopsicus.ru/all/kanobu-telegram-bot/" class="nu">«<u>Камень, ножницы, бумага</u>»</a> на основе телеграм-бота. Она кстати живая ещё, там даже кто-то играет.</p> <p>Выпустил <a href="https://mopsicus.ru/all/shardy/">Shardy</a> — мой пет-проект, фреймворк для создания онлайн игр. Пока не запушил, но несколько апдейтов уже готовы. Начал делать сервис-дискавери, думаю насчет демки для Яндекс.Игр, может на праздниках получиться, что-то поделать. И статью хотел на Хабр ещё обзорную сделать...</p> <p>Начал пользоваться <a href="https://mopsicus.ru/all/loto-cards-generator-chatgpt/">ChatGPT и другими нейронками</a>. Обработка фото, текстов, саммари, какой-то быстрый анализ. Иногда конечно выглядит как магия, хочет подробнее разобраться и сделать что-то подобное самому.</p> <p>Как-то так. В новом году будет всё лучше и интересней 🔥</p> FSM для C# 270 https://www.mopsicus.ru/all/fsm-for-csharp/ Thu, 05 Dec 2024 12:18:04 +0300 Игорь Лопатин https://www.mopsicus.ru/all/fsm-for-csharp/ <p>Доделал пакет для <a href="https://github.com/mopsicus/shardy">Shardy</a>: реализацию машины состояний (finite state machine). Все стейты и триггеры добавляются через билдер, цепочкой.</p> <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Finite state machine</h3><h4 style="display: none;" itemprop="description">Finite state machine</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/fsm-example.jpg" width="781" height="1280" alt="Finite state machine" /> </div> <p>Для перехода на стейт надо активировать триггер(ы):</p> <pre class="e2-text-code"><code class="">fsm.Trigger(Action.Down); fsm.Trigger(Action.Down);</code></pre><p>В таком случае получится такой результат:</p> <blockquote> <p>initial is standing<br /> on exit standing<br /> on enter sitting<br /> on exit sitting<br /> on enter lying</p> </blockquote> <p>Ещё подсмотрел, как сгенерить описание для UML диаграммы и <a href="https://www.planttext.com/">отрендерить её на сайте</a> или <a href="http://www.plantuml.com/plantuml/uml/">на этом</a>, по-моему у них один движок:</p> <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">FSM UML diagram</h3><h4 style="display: none;" itemprop="description">FSM UML diagram</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/fsm-uml.jpg" width="642" height="272" alt="FSM UML diagram" /> </div> <p class="note">Чтобы сделать диаграмму более «интуитивной», вместо слова state используется ключевое слово agent, этом случае можно рисовать разные линии.</p> <pre class="e2-text-code"><code class="">@startuml skin rose title TestFSM left to right direction agent Standing agent Sitting agent Lying agent Jumping note left of Jumping some help message here end note Start --&gt; Standing Standing --&gt; Sitting : Down Standing ~~&gt; Jumping : Space Sitting --&gt; Lying : Down Sitting --&gt; Standing : Up Lying --&gt; Sitting : Up Jumping --&gt; Standing : Down @enduml</code></pre><p>Ещё к каждому переходу можно добавлять условия, (на картинке выше их нет) об этом подробнее в <a href="https://github.com/mopsicus/shardy-fsm/blob/main/Documentation~/index.md">документации</a>.</p> <p>Если у перехода между состояниями есть условие(я), то линия будет рисоваться пунктирной, а если нет триггера — то с крестиком на конце. Актуально когда состояний и переходов много, можно сгенерить диаграмму и посмотреть нет ли косяков.</p> <p><a href="https://github.com/mopsicus/shardy-fsm">Github</a></p> Лото и ChatGPT 😅 269 https://www.mopsicus.ru/all/loto-cards-generator-chatgpt/ Tue, 03 Dec 2024 12:00:07 +0300 Игорь Лопатин https://www.mopsicus.ru/all/loto-cards-generator-chatgpt/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Russian Loto cards generator</h3><h4 style="display: none;" itemprop="description">Russian Loto cards generator</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/loto-generator.png" width="1664" height="1974" alt="Russian Loto cards generator" /> </div> <p>Как-то мы захотели поиграть в Русского Лото, классическое, оффлайновое, там где мешок, бочонки, карточки. Но людей много, а карточек мало, к тому же они от игры к игре повторяются. Хотелось полного рандома. Думал зайду в Google, скачаю генератор и распечатаю сколько мне нужно новых карточек. Но оказалось, что такой штуки просто нет 🤷‍♂️ Ну или я плохо искал.</p> <p>В общем, самому писать такое было неинтересно, да и некогда, поэтому решил проверить победили ли нас машины или нет, надо уже менять профессию или нет — попробовал написать всё с помощью ChatGPT. В итоге получилось всё как я хотел, но надо сказать, что это было не как в фильме Железный человек, когда Джарвис всё понимал с полуслова. В какой-то момент хотелось уже руками поправить код и забыть, но интересно было именно таким способом сделать от начала до конца.</p> <p>Получился <a href="https://gist.github.com/mopsicus/120f2e808cb22801a5c0ba2758775af1">генератор карточек для игры в Русское Лото</a>, в виде одной HTML странички, весь HTML и код на JavaScript сгенерил ChatGPT, я ни строчки не написал :) Можно указать количество страниц для генерации, и на каждой будет 4 карточки с рандомными числами в соответсвии с правилами игры. Файл сохраняется в PDF.</p> Shardy 267 https://www.mopsicus.ru/all/shardy/ Thu, 10 Oct 2024 22:33:59 +0300 Игорь Лопатин https://www.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://www.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> Морской Бой Онлайн 266 https://www.mopsicus.ru/all/sea-battle-online-game/ Mon, 09 Sep 2024 15:54:52 +0300 Игорь Лопатин https://www.mopsicus.ru/all/sea-battle-online-game/ <p>В телеграме запостил, а тут забыл совсем: встречайте лучший (по нашему мнению :) мобильный Морской Бой Онлайн aka Sea Battle aka Fleet Battle aka Warships на минималках. Это классическая игра из детства, в онлайн исполнении, с новыми возможностями, в пиратском стиле! 🏴‍ (да, у нас не тетрадный стиль!)</p> <iframe width="752" height="432" src="https://www.youtube.com/embed/bWU_KmSthXU" title="Морской Бой Онлайн (Sea Battle)" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> <p>Помимо классического режима с давно известными правилами, есть расширенный, с оружием: мины, подводная лодка, радар и РЭБ (будут ещё). Комбинируйте разные расстановки и оружие для создания выигрышной стратегии.</p> <p>Ну и конечно: быстрые партии, приятная графика, друзья, чаты, достижения, лидерборда, приватные игры, разные скины кораблей и отсутствие рекламы (только добровольная).</p> <p>И да, игра на Юнити 🤪 Пока никаких Годотов и Анрилов.</p> <p><a href="https://play.google.com/store/apps/details?id=games.magicboard.sb">Google Play</a><br /> <a href="https://apps.apple.com/ru/app/id6466614302">AppStore</a><br /> <a href="https://appgallery.huawei.com/#/app/C109196051">AppGallery</a></p> <p>У нас нет ботов, специальных алгоритмов и прочей магии. Всё реально случайно, это касается других наших игр с рандомом, в морском бое-то рандома никакого нет. И я думал что хоть тут не будет подобных отзывов... Но нет :) Некоторые игроки не ожидают, что может так повезти и кто-то может выиграть без единого промаха. Единственное объяснение у таких игроков: всё куплено, везде боты и всё подкручено 😃</p> <p>Мы играли наверно во все мобильные морские бои, скомпилировали лучшее от всех, убрав всё худшее, добавили своё уникальное. В некоторые игры иногда невозможно играть из-за агрессивной рекламной монетизации, буквально после каждой партии реклама, а у некоторых и на возврат в основное меню тоже 🙄🤯 Когда играть-то?</p> <p>В общем, присоединяйтесь к нашему морскому бою, играйте с друзьями и без рекламы!</p> Про донаты 265 https://www.mopsicus.ru/all/about-donates/ Mon, 09 Sep 2024 15:24:27 +0300 Игорь Лопатин https://www.mopsicus.ru/all/about-donates/ <p>У меня есть <a href="https://github.com/mopsicus">пару проектов в опенсорсе</a> которые я давно поддерживаю. И только совсем недавно я добавил в ридми файл инфу с кошельками, на которые можно задонатить и поддержать проект. До этого мне просто писали в личку в телеге с вопросами и благодарностями, спрашивали куда и как можно перевести. Штош, я сократил этот путь :)</p> <p>Сам закидываю в помощь авторам, где монетой, где пулл реквестом. И это касается не только разработчиков, ютуберы которые снимают интересные видео, тоже получают материальную благодарочку, а им сейчас сложно :( Считаю что хорошая работа должна быть вознаграждена!</p> <p>К чему это я? Друзья, если давно пользуйтесь какой-то бесплатной программой, утилитой, библиотекой, кодом — скиньте «спасибо» автору, купите премиум, отправьте открытку в конце концов, ему будет приятно, повысит мотивацию не забрасывать свой проект. Всем добра.</p> Unity infinite scroller v2.0 264 https://www.mopsicus.ru/all/unity-infinite-scroller-v2-0/ Tue, 02 Apr 2024 14:09:54 +0300 Игорь Лопатин https://www.mopsicus.ru/all/unity-infinite-scroller-v2-0/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">UIS (Unity infinite scroller)</h3><h4 style="display: none;" itemprop="description">UIS (Unity infinite scroller)</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/logo-uis.png" width="896" height="512" alt="UIS (Unity infinite scroller)" /> </div> <p>Обновил скрипт бесконечного списка. Переделал реп в пакет пригодный для Unity, обновил демки, добавил функцию прокрутки к элементу и доку небольшую.</p> <p>Делалось для мобилок, чтобы не тормозило с большим количеством элементов и была привычная функция pull to refresh. Но некоторые используют и в ПК билдах 😄</p> <p><a href="https://github.com/mopsicus/uis">Github</a></p> Unity Mobile Input v2.0 263 https://www.mopsicus.ru/all/unity-mobile-input-v2-0/ Wed, 27 Mar 2024 14:16:56 +0300 Игорь Лопатин https://www.mopsicus.ru/all/unity-mobile-input-v2-0/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">UMI aka Unity Mobile Input</h3><h4 style="display: none;" itemprop="description">UMI aka Unity Mobile Input</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/umi-v2.png" width="1468" height="612" alt="UMI aka Unity Mobile Input" /> </div> <p>Обновил свой плагин для создания нативных полей ввода на мобилках. Исправил старые баги, причесал немного код, добавил комменты и обновил демо.</p> <p>Функции:</p> <ul> <li>нативное поле ввода и клавиатура для iOS и Android</li> <li>настройка типа кнопки: Стандартная, Далее, Готово, Поиск, Отправить</li> <li>настройка обработки кнопки</li> <li>настройка кнопкок Готово и Очистить (iOS)</li> <li>изменение опций поля ввода во время выполнения</li> <li>скрытие дополнительного поля ввода (Android)</li> <li>отслеживание появления и скрытия клавиатуры (с высотой)</li> <li>отслеживание ориентации экрана</li> <li>поддержка пользовательских шрифтов</li> </ul> <p>В новой версии добавил несколько методов чтобы можно было менять некоторые параметры во время исполнения:</p> <ul> <li>SetTextColor — изменение цвета текста</li> <li>SetPlaceholderColor — изменение цвета текста подсказки</li> <li>SetBackgroundColor — изменение цвета фона</li> <li>SetContentType — изменение типа поля ввода</li> <li>SetReadonly — изменение состояния «только для чтения»</li> </ul> <p>Устанавливается как пакет через Unity Package Manager.</p> <p><a href="https://github.com/mopsicus/umi">Github</a></p> Игра «Камень, ножницы, бумага» 262 https://www.mopsicus.ru/all/kanobu-telegram-bot/ Wed, 14 Feb 2024 11:11:39 +0300 Игорь Лопатин https://www.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://www.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> Герои Гильдгаарда 261 https://www.mopsicus.ru/all/heroes-of-gildgaard/ Sun, 24 Sep 2023 13:25:31 +0300 Игорь Лопатин https://www.mopsicus.ru/all/heroes-of-gildgaard/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Герои Гильдгаарда</h3><h4 style="display: none;" itemprop="description">Герои Гильдгаарда</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/banner.png" width="1500" height="500" alt="Герои Гильдгаарда" /> </div> <p>Запустили в софтлонч нашу первую игру с 3D, логическая онлайн стратегия на 2 или 4 игрока. Для любителей шашек, нард, шахмат, го и прочих настольных игр такого типа, будет интересно. Тут нет рандома, есть несколько стратегий, партии довольно короткие. Написал чуть <a href="https://pikabu.ru/story/geroi_gildgaarda_logicheskaya_onlayn_strategiya_10671660">подробнее на Пикабу</a>.</p> <p>Делали на Unity. Доступно в <a href="https://apps.apple.com/ru/app/id1642705298">AppStore</a>, <a href="https://play.google.com/store/apps/details?id=games.magicboard.hg">Google Play</a> и <a href="https://appgallery.huawei.com/#/app/C106987185">AppGallery</a>.</p> «AirDrop» для Android 260 https://www.mopsicus.ru/all/airdrop-for-android-nearby/ Tue, 18 Apr 2023 11:41:11 +0300 Игорь Лопатин https://www.mopsicus.ru/all/airdrop-for-android-nearby/ <p>У Андроид есть похожая технология обмена файлами «по воздуху», но работает она также, в своей экосистеме, как и у Эпла. Хотя казалось бы, пора сделать какой-то открытый стандарт типа блютуса, или он уже есть...</p> <p>В общем, чтобы было как с айфоном только с андроидом, можно использовать приложение <a href="https://github.com/grishka/NearDrop">NearDrop</a>. Ставится на мак и можно с андроида, через стандартный способ «поделиться поблизости» отправить файл на мак, очень похоже на AirDrop. В обратную сторону пока не работает. Но возможно будет.</p> Unity Builder Bot 259 https://www.mopsicus.ru/all/telegram-bot-builder-unity/ Wed, 08 Jun 2022 20:12:33 +0300 Игорь Лопатин https://www.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://www.mopsicus.ru/pictures/ubh.png" width="700" height="794" alt="Unity Builder Helper" /> <img src="https://www.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> Unity и WebGL 257 https://www.mopsicus.ru/all/unity-webgl-tips/ Sat, 23 Apr 2022 17:50:39 +0300 Игорь Лопатин https://www.mopsicus.ru/all/unity-webgl-tips/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Unity WebGL tips</h3><h4 style="display: none;" itemprop="description">Unity WebGL tips</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/unity-webgl-tips.png" width="1204" height="835" alt="Unity WebGL tips" /> </div> <p>Не от хорошей жизни пришлось делать WebGL версии наших мобильных игр :) Т. е. изначально, игры не продумывалась для браузера, но тем не менее, после небольших доработок и рефакторинга — всё необходимое заработало. Эта статья как раз для тех, кто задумался над выпуском версии для веб: набор из нескольких наблюдений, советов, собственных мыслей и велосипедов.</p> <p><b>Вебсокеты</b>. Так как у нас все игры — онлайн, то первое что сделал — поддержка сети. В мобильных играх у нас используются TCP сокеты, для браузера же надо использовать вебсокеты (WebSocket). И сразу надо сказать: C#’ские вебсокеты работать не будут. Надо брать готовый или писать свой JS плагин. И в качестве примера, в телеграм канале я уже постил <a href="https://github.com/jirihybek/unity-websocket-webgl">этот реп</a>. Он старый, работает и для примера пойдёт. Там кстати сделана поддержка вебсокетов в редакторе (уже через C#’ские). Т. е. можно дебажить и билдить, работать всё будет. В ассетсторе тоже есть разные реализации вебсокетов для WebGL, можно поискать, есть и Socket.IO, Mirror.</p> <p class="note">Да, для WebGL тоже можно и нужно <a href="https://docs.unity3d.com/Manual/webgl-interactingwithbrowserscripting.html">писать плагины</a>, как и для Android и iOS.</p> <p>В общем, в браузере много что работать не будет и особенно всё что связано с мобильной платформой: галерея, авторизация, пуши, буфер обмена, платежи — это всё надо делать или через JS плагины, менять реализацию или вообще отказываться.</p> <p><b>Платежи</b>. Google Play и AppStore не работают в WebGL. В том смысле что нельзя получить информацию о продукте (описание, цена и т. д.) и сделать покупку в браузере. Поэтому мы сделали просто: вместо запроса списка продуктов, делаем запрос к нашему серверу (сервер определяет что клиент WebGL) и в ответ получаем примерно такую же структуру: цена: описание, количество. Но самое главное — приходит ещё и ссылка для оплаты! Т. е. для пользователя визуально всё осталось также, но при попытке оплаты открывается новая вкладка с сформированной ссылкой на оплату нужного товара. А тут уже можно подключить любой удобный сервис приема платежей и по коллбеку успешной оплаты начислять пользователю определенное количество продукта. Вот такие антисанкции.</p> <p><b>Загрузка изображений</b>. Тут проще, в браузерах уже есть встроенный механизм загрузки файлов, его и можно использовать. Вот <a href="https://github.com/greggman/getuserimage-unity-webgl">пример как это реализовано</a>, а на SO можно <a href="https://stackoverflow.com/a/35201934">прочитать</a> как автор до этого дошёл. К слову, этот код рабочий. Немного корявенький, требует рефакторинга, но работает. Картинка приходит в Unity в base64, раскукоживаете её в массив байт и дальше уже что требуется: отправляете на сервер, используйте в игре и т. п.</p> <p><b>Уведомления</b>. Все ненавидят уведомления в браузере. И у нас их скорее всего не будет. Но раз обещал, напишу что сохранил для себя если вдруг надумаем (или вы надумаете) делать пуши: плагин можно собрать из таких <a href="https://forum.unity.com/threads/unity-webgl-firebase-cloud-messaging-jslib-plugin.837307/">запчастей</a>, честно не пробовал ещё, скорее всего буду свой писать :) Это <a href="https://firebase.google.com/docs/cloud-messaging/js/client">Firebase Cloud Messaging</a>, он бесплатный и вообще можно отсылать пуши на все платформы. Для реализации на своем сервере, например для NodeJS, можно погуглить <a href="https://www.npmjs.com/package/web-push">web-push</a>. На Хабре есть статьи, вот свежая относительно <a href="https://habr.com/ru/post/562058/">про PHP и web пуши</a>. Есть еще <a href="https://pushjs.org">pushjs.org</a>, оно вроде как работает во всех браузерах, можно устанавливать кастомный сервис-воркер. Как писать воркеры можно <a href="https://serviceworke.rs">почитать в таком cook-book’e</a>. Но опять же, всё что связано с пушами не проверял ещё.</p> <p><b>Google и Apple авторизация</b>. У нас в приложениях как раз используются такие способы авторизации. И для них есть возможность сделать веб авторизацию, чего не скажешь про Huawei ID, хотя может и китайцы скоро допилят. Так вот, тут тоже всё относительно просто: открываете мануал как сделать веб авторизацию на своем сервере и делаете: <a href="https://developers.google.com/identity/gsi/web/guides/overview">Google</a> и <a href="https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/configuring_your_webpage_for_sign_in_with_apple">Apple</a>. Про Apple есть еще норм <a href="https://habr.com/ru/company/cian/blog/475062/">статья на Хабре от ЦИАН</a>. Основной момент тут — это редирект после успешной авторизации, туда можно подставить свои параметры, а внутри плагина перехватить их и использовать для авторизации уже в WebGL приложении. Вот нашел <a href="https://stackoverflow.com/a/66514111">грубый пример</a> как это может работать. Автор как и предупреждает не совсем верно использует запрос авторизации. Лучше открывать свою страницу с кнопкой(-ми) авторизации и уже после успешного завершения перехватывать редирект со своего сайта.</p> <p><b>Где размещаться?</b> В комментариях в телеге спросили на каких сервисах публикуем WebGL игры — точно будем пока на своих сайтах, для нас это больше инструмент для платежей. Но в перспективе, рассматриваем ВК и Одноклассники. Может и во вражеском ФБ, кто знает. На реддите нашёл вот небольшой <a href="https://www.reddit.com/r/webgl/comments/ek8xyq/which_are_the_best_webgl_publishing_website_for/">список</a> где можно разместиться, старый, но наверняка что-то живое есть, <a href="https://itch.io">https://itch.io</a> точно.</p> <p>И бонус, как сделать рабочий <a href="https://stackoverflow.com/a/30810322">вариант копирования в буфер обмена</a> во всех (вроде как) браузерах.</p> <p>Ну и ещё бонус, точнее анонс: мы делаем онлайн мобильную 3D игру, до этого как-то больше по 2D всё было, так что будут интересности по 3D. Подписывайтесь на <a href="https://t.me/mopsicus_ru">Telegram канал</a>.</p> Что делать? 255 https://www.mopsicus.ru/all/dont-panic/ Fri, 11 Mar 2022 13:00:52 +0300 Игорь Лопатин https://www.mopsicus.ru/all/dont-panic/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Relocation meme</h3><h4 style="display: none;" itemprop="description">Relocation meme</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/relocation.jpg" width="497" height="327" alt="Relocation meme" /> </div> <p>Друзья! В свете последних событий, какие есть пути решения вопроса с покупками, рекламой да и вообще. Пока оставим варианты с релокацией и прочим (они тоже работают, но не у всех есть возможность) и подумаем, что можно сделать прямо сейчас:</p> <p>1️⃣ Выпустить свои игры в Huawei AppGallery<br /> 2️⃣ Сделать WebGL версии игр<br /> 3️⃣ Сделать «заглушку» и принимать оплату через сайт<br /> 4️⃣ Передать игры на другой аккаунт, который не связан с РФ<br /> 5️⃣ Не паниковать</p> <p>По поводу пункта №3. Да, такая возможность есть, но как говорил Чапаев: <a href="https://support.google.com/googleplay/android-developer/answer/9858738?visit_id=637824938727131217-4270682718&rd=1">есть нюанс</a>. Нельзя чтобы в приложении была ссылка на эту страницу оплаты или чтобы она как-то упоминалась вообще, в тексте, в вебвью, где угодно, может быть атата. Это если говорить про Google Play, в AppStore тоже по-моему такое запрещено.</p> <p>Кроме того, вам никто не запретит сделать WebGL версию игры и принимать оплату любым удобным способом. Ну а как связать мобильный аккаунт и веб-версию это дело техники. Таким образом можно пополнять баланс через веб и играть на телефоне, например.</p> <p>В данный момент как раз делаю транспорт на вебсокетах для существующих игр, чтобы можно было выпустить WebGL версии. В Huawei AppGallery уже сделали порты всех игр, по чуть-чуть онлайн растет. Хотя там особо сложного ничего не было, из хуавейного сдк используем только авторизацию, пуши и покупки.</p> EmojiHelper для Unity 254 https://www.mopsicus.ru/all/emoji-helper-unity/ Mon, 31 Jan 2022 18:02:15 +0300 Игорь Лопатин https://www.mopsicus.ru/all/emoji-helper-unity/ <p><a href="https://mopsicus.ru/all/emoji-in-unity/">Как добавить эмоджи</a>, я уже писал как-то. Но проблема до сих пор в том, что некорректно работают модификаторы. Точнее — они не работают. Т. е. если вы захотите использовать какой-то флаг или определенный цвет кожи или ещё что-то, то у вас вместо одного нужного эмоджи будет два, а то и три. Чтобы использовать эмоджи полноценно, написал небольшой <a href="https://gist.github.com/mopsicus/3903a1f111a738375a363b9e3f058385">хелпер</a>.</p> <p>Как это работает:</p> <ol start="1"> <li>Создаём спрайт атласы с эмоджи. Лучше разбить их на более мелкие или по группам, по категориям, по популярности...</li> <li>Делаем основной спрайт атлас и к нему цепляем как вспомогательные все остальные. Это может выглядеть как-то так:</li> </ol> <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Emojis fallback list</h3><h4 style="display: none;" itemprop="description">Emojis fallback list</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/emojis-fallback.png" width="534" height="724" alt="Emojis fallback list" /> </div> <ol start="3"> <li>Не забываем выставить настройки TMP:</li> </ol> <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name"></h3><h4 style="display: none;" itemprop="description"></h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/tmp-emoji-settings.png" width="496" height="226" alt="" /> </div> <ol start="4"> <li>Теперь через хелпер можно использовать эмоджи:</li> </ol> <pre class="e2-text-code"><code class="">/// Можно применять сразу к TMP компоненту MyTMPText.CheckAndParseEmoji(&lt;text with emoji here&gt;);</code></pre> 2021 252 https://www.mopsicus.ru/all/2021-summary/ Fri, 14 Jan 2022 14:18:25 +0300 Игорь Лопатин https://www.mopsicus.ru/all/2021-summary/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Bye 2021 year</h3><h4 style="display: none;" itemprop="description">Bye 2021 year</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/bye-2021.png" width="1182" height="860" alt="Bye 2021 year" /> </div> <p>За прошлый год мы выпустили 3 онлайн игры: две настолки и игру в слова. Причём так совпало, что все релизы были на вторую половину года. Раньше получалось примерно по одной в год. Показатели уже неплохие, онлайн растёт, ин-аппы покупаются, реклама просматривается, оценки хорошие.</p> <p>Рассылку пришлось закрыть :( Многие мне писали и спрашивали, буду ли продолжать — пока не могу сказать, это отнимает время, а его пока нет на такие вещи.</p> <p>Выпустили игру в Huawei AppGallery. Отдельный квест. Но надо признать, китайцы молодцы, они скопировали гугл-сервисы и улучшили их. Если есть нативное приложение под Android, то перенести его в AppGallery в общем-то не сложно. Если надо опубликовать приложение сделанное на Unity, то надо будет сделать несколько плагинов или использовать готовые.</p> <p>Стал меньше писать в блог, думаю в этом году это исправить. Есть темы которыми хотел бы поделиться. Ещё думаю сменить Эгею на что-то другое, более гибкое, может какой-нибудь статический генератор сайтов.</p> <p>Так и не смог регулярно постить в телеграм, это должен был быть ещё один канал связи, с более частыми постами чем в рассылке...</p> <p>На 2022 в планах зарелизить минимум столько же игр: настолку, три в ряд, головоломку. А может и больше! Новый движок на основе RPC и событий показал себя с лучшей стороны. По чуть-чуть обрастает новыми фичами. Делать на нём новые игры можно без боли :)</p> <p>Год был продуктивным. Желаю всем игр в 2022 году!</p> <p class="foot">Unity Hub обновился, теперь красивенький</p> Unity iOS localization 251 https://www.mopsicus.ru/all/unity-ios-localization/ Mon, 08 Nov 2021 17:39:29 +0300 Игорь Лопатин https://www.mopsicus.ru/all/unity-ios-localization/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Unity iOS localization scripts</h3><h4 style="display: none;" itemprop="description">Unity iOS localization scripts</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/ios-unity-localization.png" width="1280" height="720" alt="Unity iOS localization scripts" /> </div> <p><a href="https://github.com/mopsicus/unity-ios-localization">Исходники на Github</a></p> <p>Мобильные Unity разработчики меня сейчас должны понять: когда делаешь билд под iOS, то локализацию «из коробки» настроить не получится. Конечно, есть разные ассеты и даже! <a href="https://docs.unity3d.com/Packages/com.unity.localization@1.0/manual/index.html">официальный пакет для локализации</a>. С которым уже можно работать, кстати. Но как обычно, самое интересное в деталях...</p> <p>Если ваша игра поддерживает несколько языков, к примеру: русский, английский, немецкий, испанский, то для каждого языка неплохо бы сделать локализуемое название игры. Кроме того, если игра/приложение использует камеру или галерею, то нужно показывать диалог запроса прав доступа, тоже локализованный, иначе апрув скорее всего не пройти. Для этого, обычно используется файл <b>InfoPlist.strings</b> и содержимое его выглядит как-то так:<br />  </p> <pre class="e2-text-code"><code class="">&quot;CFBundleDisplayName&quot; = &quot;Локализованное название&quot;; &quot;NSCameraUsageDescription&quot; = &quot;Тут описание зачем приложению доступ к камере&quot;; &quot;NSPhotoLibraryUsageDescription&quot; = &quot;Тут описание зачем доступ к галерее&quot;; &quot;NSPhotoLibraryAddUsageDescription&quot; = &quot;Тут описание зачем доступ к галерее&quot;; &quot;NSUserTrackingUsageDescription&quot; = &quot;Тут описание зачем доступ к IDFA&quot;;  </code></pre><p>В общем-то всё это уже можно сделать официальным пакетом локализации, кроме <i>NSUserTrackingUsageDescription</i> по-моему. Но так как я всё равно использую пост-билд скрипт для добавления файлов, фреймворков и установки различных параметров через ProjectCapabilityManager, то использовать ещё один пакет не хотелось бы. Тем более, пакет для локализации сам использует приватные методы пространства имен <b>UnityEditor.iOS.Xcode</b>. Вот тут-то и нашлось решение. С помощью рефлексии вытянуть нужные методы и сделать расширение для PBXProject.</p> <p>В итоге, получился всего один файл с расширением, который позволяет:</p> <ul> <li>очистить неиспользуемые локали</li> <li>добавить используемые языки в приложении, из списка</li> <li>добавить <i><код_языка>.lproj</i> папки в проект с файлами InfoPlist.strings</li> </ul> <p>В старых проектах я использовал <a href="https://github.com/superbderrick/UnityiOSLocalization">UnityiOSLocalization</a>, он работал, но его «проблема» в большом количестве файлов, которые когда-то были доступны на Bitbucket’е, потом это всё стало приватным — т. е. это то что сейчас получилось вытянуть через рефлексию.</p> <p>Скорее всего когда допилят официальный пакет, всё это станет не актуальным, ну а пока можно пользоваться.</p> Разработка Unity плагинов для iOS и Android 250 https://www.mopsicus.ru/all/razrabotka-unity-plaginov-dlya-ios-i-android/ Tue, 05 Oct 2021 11:56:12 +0300 Игорь Лопатин https://www.mopsicus.ru/all/razrabotka-unity-plaginov-dlya-ios-i-android/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Unity plugins system on JSON</h3><h4 style="display: none;" itemprop="description">Unity plugins system on JSON</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/unity-plugins-systems.png" width="1200" height="630" alt="Unity plugins system on JSON" /> </div> <p>Наконец-то дописал <a href="https://habr.com/ru/post/581160/">статью про создание плагинов</a>. В процессе «дописания» нашёл и пофиксил баг под iOS, так что — не зря :)</p> Unity и AndroidManifest 249 https://www.mopsicus.ru/all/unity-patch-android-manifest/ Mon, 27 Sep 2021 10:19:38 +0300 Игорь Лопатин https://www.mopsicus.ru/all/unity-patch-android-manifest/ <p>Друзья, нас обманывали!</p> <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Android Manifest hardwareAccelerated patch</h3><h4 style="display: none;" itemprop="description">Android Manifest hardwareAccelerated patch</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/android-activity-manifest.png" width="1790" height="1238" alt="Android Manifest hardwareAccelerated patch" /> <div class="e2-text-caption">Ещё куча параметров, которые можно установить для Activity</div> </div> <p>Это такое начало специально, чтобы привлечь внимание :) На самом деле, я просто не знал, что так может быть. Узнал вовремя и хочу поделиться.</p> <p>Когда вы в своём кастомном андроид манифесте выставляете такую штуку:</p> <pre class="e2-text-code"><code class="">&lt;activity android:name=&quot;com.xxx.xxx&quot; android:label=&quot;@string/app_name&quot; ... android:hardwareAccelerated=&quot;true&quot;&gt;</code></pre><p>И ждёте что будет работать аппаратное ускорение у конкретного активити, то... оно не будет работать. Бум! Т. е. если вы сбилдите apkшку, расковыряете её и посмотрите итоговый манифест, то вместо вашего <b>true</b> будет стоять кое-что другое. Почему так происходит я пока не разобрался, но узнал как исправить.</p> <p>Оказывается, начиная с 2018 версии в Unity есть такая штука как <a href="https://docs.unity3d.com/ScriptReference/Android.IPostGenerateGradleAndroidProject.OnPostGenerateGradleAndroidProject.html">IPostGenerateGradleAndroidProject</a>. Она вызывается после того как Gradle сделал своё грязное дело и перед непосредственно билдом. Так вот, на этом этапе и можно поменять в манифесте нужные нам параметры. В общем-то, можно добавлять или менять всё что угодно, разрешения, параметры, имена активити и т. д.</p> <p><a href="https://gist.github.com/mopsicus/1d825521b6db402910dbaca742f49651">Пример на Github</a></p> UPM Unity fail [solve?] 248 https://www.mopsicus.ru/all/upm-unity-solve-case/ Tue, 14 Sep 2021 11:49:01 +0300 Игорь Лопатин https://www.mopsicus.ru/all/upm-unity-solve-case/ <p>В продолжении темы Unity Package Manager’а: недавно тоже столкнулся с проблемой, что при запуске редактора он не мог приконнектиться. Загуглил и оказалось, что это распространённая проблема.</p> <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">UPM Health Check</h3><h4 style="display: none;" itemprop="description">UPM Health Check</h4><img itemprop="contentUrl" src="https://www.mopsicus.ru/pictures/upm-fail.png" width="424" height="227" alt="UPM Health Check" /> <div class="e2-text-caption">Ошибка на скриншоте не соответствует, но состояние такое же</div> </div> <p>В основном после диагностики показывает: UPM Health Check (Fail). На оффоруме уже сделали специальный <a href="https://forum.unity.com/threads/read-me-first-troubleshooting-connection-loading-project-issues-with-package-manager.869683/">закреп</a>, как это исправить. Я попробовал всё — и ничего не помогло. Просто не подключается. Хотя на соседнем компьютере, все работает нормально, т. е. дело не в сети.</p> <p>В итоге опытным путём выяснил, что проблема была в VPN клиенте Cloudflare, который <a href="https://1.1.1.1.">https://1.1.1.1.</a> Даже в выключенном состоянии, он как-то блокировал локальные адреса и порты. Удалил и всё сразу заработало. Так что, если вдруг столкнулись с этой проблемой, проверьте свой файрвол и впн клиент, если такие есть.</p>