#mopsicus: заметки с тегом git https://mopsicus.ru/tags/git/ об играх, разработке на Unity и личном опыте Игорь Лопатин ru E2 (v3572; Aegea) Игорь Лопатин об играх, разработке на Unity и личном опыте FSM для C# 270 https://mopsicus.ru/all/fsm-for-csharp/ Thu, 05 Dec 2024 12:18:04 +0300 Игорь Лопатин https://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://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://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> Как использовать Git Submodules в Unity 247 https://mopsicus.ru/all/using-git-submodules-unity/ Fri, 10 Sep 2021 09:58:32 +0300 Игорь Лопатин https://mopsicus.ru/all/using-git-submodules-unity/ <p>И тут сразу возникает вопрос: почему не использовать пакеты и UPM? Это удобно, да и весь механизм уже встроен в Unity?</p> <p>Но как оказалось, не всегда удаётся выделить какую-то часть приложения в отдельный пакет, чтобы у него было минимум зависимостей и он представлял из себя какую-то самостоятельную единицу. Проекты бывают разные, с различной архитектурой и набором дополнительных ассетов и прочего. А выделить какую-то общую часть (ядро) хочется, чтобы использовать её в других проектах... В общем, если по какой-то причине пакеты вам не подходят — попробуйте Git Submodules.</p> <p>В чём отличие при работе с сабмодулями гита?<br /> Unity использует скрипты и ассеты которые расположены в папке <b>Assets</b>. Если вы попробуйте подключить сабмодуль и указать путь, например <b>Assets/Core</b>, то ничего не получится, потому что папка Assets уже существует. Поэтому надо провернуть такой финт:</p> <ol start="1"> <li>Подключаете сабмодуль к проекту (как это сделать, тут описывать не буду, потому что есть разные клиенты SourceTree, Fork, GitKraken, просто консоль)</li> <li>В качестве директории можно указать <b>Modules/your_module</b></li> <li>Переходите в папку Assets</li> <li>Устанавливаете симлинк (symlink) на новый сабмодуль. Всё! Он у вас в проекте, можно пользоваться.</li> </ol> <pre class="e2-text-code"><code class="">cd Assets ln -s ../Modules/Core Core</code></pre><p>Выглядеть это будет примерно так:</p> <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Unity Git submodules</h3><h4 style="display: none;" itemprop="description">Unity Git submodules</h4><img itemprop="contentUrl" src="https://mopsicus.ru/pictures/unity-submodules.png" width="1102" height="1012" alt="Unity Git submodules" /> </div> <p>Теперь если в подключаемых сабмодулях, что-то меняется, надо просто спуллить обновления. В общем, кто привык работать с Git, то всё достаточно привычно и понятно.</p> 200 звёзд на Github 232 https://mopsicus.ru/all/200-stars-github-infinite-scroll-unity/ Tue, 12 Jan 2021 11:27:07 +0300 Игорь Лопатин https://mopsicus.ru/all/200-stars-github-infinite-scroll-unity/ <p class="loud">Achievement unlocked!</p> <p>Моё новое скромное достижение. Скрипт с <a href="https://github.com/mopsicus/infinite-scroll-unity">data-driven прокруткой для Unity</a>, получил 200 звёзд на Github. Спасибо S1ROZHA :)</p> <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Infinite scroll unity 200 stars</h3><h4 style="display: none;" itemprop="description">Infinite scroll unity 200 stars</h4><img itemprop="contentUrl" src="https://mopsicus.ru/pictures/scroll-200-stars.png" width="661" height="185" alt="Infinite scroll unity 200 stars" /> </div> <p>Мне как-то писали, что используют его в MTG Arena и ещё какой-то популярной игре. Приятно что этим пользуюсь не только я.</p> Установка сразу на несколько Android устройств 198 https://mopsicus.ru/all/install-uninstall-multiple-android-devices/ Wed, 26 Feb 2020 12:22:04 +0300 Игорь Лопатин https://mopsicus.ru/all/install-uninstall-multiple-android-devices/ <p>При тестировании приложений часто приходится переустанавливать приложение, это очевидно. Когда я делал для себя <a href="https://mopsicus.ru/all/custom-ci-cd-unity/">мини CI\CD</a>, то там уведомление с ссылкой на APK или IPA, приходило в телеграм. Это удобно, когда на девайсах уже всё настроено и есть доступ к телеге. Скачал и установил.</p> <p>Но есть у меня и много девайсов на Android, которые периодически сбрасываются до заводских настроек. Каждый раз устанавливать и настраивать телеграм на каждом — как-то утомительно. Поэтому, я написал небольшой баш-скрипт который устанавливает/удаляет приложение <b>сразу со всех</b> подключенных андроид устройств. Было б нужное количество портов и проводов :)</p> <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Console APK install tool</h3><h4 style="display: none;" itemprop="description">Console APK install tool</h4><img itemprop="contentUrl" src="https://mopsicus.ru/pictures/installtools.png" width="761" height="684" alt="Console APK install tool" /> </div> <p>Если необходимо, то эти функции можно добавить и в прошлый скрипт для CI\CD, если не нужно закачивать APK на сервер и отправлять уведомление.</p> <p><a href="https://gist.github.com/mopsicus/f17925def0a178e85bf802c58872ac13">Исходник на Github</a></p> TabsView для Unity 195 https://mopsicus.ru/all/tabs-view-unity/ Wed, 19 Feb 2020 13:57:46 +0300 Игорь Лопатин https://mopsicus.ru/all/tabs-view-unity/ <p>Сегодня у нас раздел «Велосипедостроение» :)</p> <div class="lazy" data-expose="true" data-effect="relax"><div class="e2-text-video"> <iframe src="https://www.youtube.com/embed/RKvR7h9oFAI" frameborder="0" allowfullscreen></iframe></div></div> <p class="note">Если DOTween в проекте не используется, можно его выпилить и сделать вручную, чтобы не тащить библиотеку.</p> <p>Когда-то давно понадобилось сделать в UI горизонтальную прокрутку табами. В iOS есть такой стандартный элемент. В Android по-моему тоже. Для Unity как известно стандартные UI компоненты довольно скудны. Поэтому каждый придумывает себе, по мере надобности. Вот и получилось когда-то такое, довольно простое решение.</p> <ul> <li>Управляется свайпами</li> <li>Есть индикаторы состояния табов</li> <li>Анимации можно делать любые, с помощью <a href="http://dotween.demigiant.com/download.php">DOTween</a></li> <li>На переключение таба можно повесить хук</li> </ul> <p><a href="https://github.com/mopsicus/unity-tabs-view">Исходники на Github</a></p> Свой CI/CD для Unity 188 https://mopsicus.ru/all/custom-ci-cd-unity/ Thu, 12 Dec 2019 14:44:40 +0300 Игорь Лопатин https://mopsicus.ru/all/custom-ci-cd-unity/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Mopsicus CI/CD bash script</h3><h4 style="display: none;" itemprop="description">Mopsicus CI/CD bash script</h4><img itemprop="contentUrl" src="https://mopsicus.ru/pictures/build.gif" width="512" height="283" alt="Mopsicus CI/CD bash script" /> </div> <p>Написал небольшую <a href="https://habr.com/ru/post/479884/">статью на Хабр</a> про скрипт который получился в результате автоматизации сборки Unity проектов под Android и iOS. Раньше большинство операций делалось вручную, теперь всё сведено к минимуму.</p> <p>Один запуск скрипта и:</p> <ul> <li>скачиваются последние изменения с GIT</li> <li>запускаются тесты</li> <li>собирается APK для Android, в develop или release</li> <li>собирается для iOS Xcode проект, в develop или release</li> <li>компилируется</li> <li>архивируется и экспортируется в IPA</li> <li>генерируется манифест для него</li> <li>генерируются HTML страницы для установки</li> <li>всё это загружается на сервер с помощью sshpass</li> <li>все логи записываются в отдельную папку</li> <li>отсылается уведомление в Телеграмм, что всё готово</li> </ul> <p>Вот такая интеграция и доставка :)</p> <p><a href="https://github.com/mopsicus/unity-build-pipeline">Исходники на Github</a></p> 100 звёзд на Github 169 https://mopsicus.ru/all/github-100-stars/ Mon, 08 Jul 2019 10:34:58 +0300 Игорь Лопатин https://mopsicus.ru/all/github-100-stars/ <p><a href="https://github.com/mopsicus/infinite-scroll-unity">Скрипт с бесконечным скроллом для Unity</a> получил 100 звёзд на Github. Вроде мелочь, а приятно :)</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/scroller-git-stars.png" width="474" height="169" alt="" /> </div> <p>Кстати, если решили что-то делать в open source, но не знаете как начать, прочтите этот <a href="https://ru.hexlet.io/blog/posts/participate-in-open-source">перевод небольшой статьи на Hexlet</a>.</p> Обновление UnityMobileInput 138 https://mopsicus.ru/all/update-unity-mobile-input/ Fri, 16 Nov 2018 12:53:48 +0300 Игорь Лопатин https://mopsicus.ru/all/update-unity-mobile-input/ <p>Теперь высота клавиатуры считается правильно везде и экран не сдвигается вверх при появлении клавиатуры. Это на Android такая история была.</p> <p>Зарефакторил много старого кода, убрал не нужное, добавил кастомный инспектор, все настройки поля теперь берутся из Unity UI компонента InputField, клавиатура не пропадает если переключаться между полями и другие мелочи.</p> <p class="note">Напомню, что в Unity есть один нюанс при работе с пользовательским вводом на андроидах — появляется дополнительное поле ввода над клавиатурой. Оно, в общем-то работает, но с ограничениями (нельзя выделять текст и другие нативные штуки) и занимает место.</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/unitymobileinput-inspector-old.png" width="571" height="227" alt="" /> <div class="e2-text-caption">Было</div> </div> <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/unitymobileinput-inspector.png" width="558" height="258" alt="" /> <div class="e2-text-caption">Стало</div> </div> <p>Вроде работает :)<br /> <a href="https://mopsicus.ru/all/unity-mobile-input-plugin/">UnityMobileInput</a></p> GitHub для Unity 119 https://mopsicus.ru/all/github-for-unity/ Thu, 21 Jun 2018 10:37:14 +0300 Игорь Лопатин https://mopsicus.ru/all/github-for-unity/ <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/github-unity.gif" width="1920" height="1080" alt="" /> </div> <p>Юнитеки озадачились и выпустили из беты <a href="https://assetstore.unity.com/packages/tools/version-control/github-for-unity-118069">Github for Unity</a>. Как понятно из названия, это расширение для работы с Github. Теперь все операции можно делать прямо из редактора. Кроме того, есть ряд приятных мелочей:</p> <ul> <li>большие файлы загружаются в отдельное хранилище LFS (Large Files Storage)</li> <li>отображение различий в файлах с использованием различных предустановок</li> <li>строка с быстрыми действиями в Git</li> <li>уведомления с обновлениями</li> </ul> <p><a href="https://unity.github.com">Исходный код расширения</a> доступен на Github (где же ещё :).</p> Armory3D 118 https://mopsicus.ru/all/armory3d-blender-game-engine/ Wed, 13 Jun 2018 22:20:39 +0300 Игорь Лопатин https://mopsicus.ru/all/armory3d-blender-game-engine/ <p>Это игровой движок для Blender. Все модели, материалы, свет и прочее, идут из 3D редактора — полная интеграция.</p> <div class="lazy" data-expose="true" data-effect="relax"><div class="e2-text-video"> <iframe src="https://www.youtube.com/embed/zVjk_WOdk2Q" frameborder="0" allowfullscreen></iframe></div></div> <p>Достаточно интересный инструмент. Он ещё в разработке, но уже много что сделано:</p> <ul> <li>не нужно ничего никуда экспортировать/импортировать — всё уже в блендере</li> <li>неплохая система рендера</li> <li>физика</li> <li>звуки</li> <li>сеть</li> <li>глобальное освещение на вокселях</li> <li>поддержка нод: шейдеры, логика и т. п.</li> </ul> <p class="note">В основе всего этого, кроссплатфоменные <a href="https://haxe.org">Haxe</a> и <a href="http://kha.tech">Kha</a></p> <p>Естественно, в 2018 году, можно (и нужно) билдить под все основные платформы:</p> <ul> <li>Android, iOS</li> <li>Windows, Linux, Mac</li> <li>PS4, Xbox One, Switch</li> <li>HTML5</li> <li><a href="https://github.com/KTXSoftware/Kha/wiki">Ещё куча</a></li> </ul> <p>Больше <a href="https://www.youtube.com/channel/UCo31w0CHeRGKuvJUCjU14qg/videos">видео на канале</a> в Youtube.<br /> Начиная с последней версии, <a href="http://armory3d.org">движок</a> стал бесплатным! Все исходники лежат на Github.</p> Unity Mobile Input 113 https://mopsicus.ru/all/unity-mobile-input-plugin/ Tue, 10 Apr 2018 11:31:43 +0300 Игорь Лопатин https://mopsicus.ru/all/unity-mobile-input-plugin/ <p>Выложил на Github плагин нативного ввода для мобильных устройств. Это небольшая надстройка над стандартным Unity InputField UI. Работает на iOS и Android.</p> <p>Зачем он нужен:</p> <ol start="1"> <li>Нативное поле ввода и клавиатура</li> <li>Отсутствует раздражающее дополнительное поле над клавиатурой в Android</li> <li>Для iOS можно добавить кнопку «Готово»</li> <li>Настройка кнопки Return для клавиатуры: стандартная, далее, готово, поиск</li> <li>Для работы нужно просто повестить скрипт <b>MobileInput</b> на родной InputField UI</li> </ol> <div class="lazy" data-expose="true" data-effect="relax"><div class="e2-text-video"> <iframe src="https://www.youtube.com/embed/181jrTj2Upg" frameborder="0" allowfullscreen></iframe></div></div> <p>До этого, было <a href="https://mopsicus.ru/all/hide-mobile-input-android-unity/">временное решение</a>, которое не обладало необходимыми опциями, да и ошибки были. Собственно, на то оно и временное :) Но в Unity до сих пор нет таких возможностей для ввода, поэтому пришлось сделать такой плагин.</p> <p class="foot">В моей версии исправлены ошибки и отрефакторен почти весь код от старого и неподдерживаемого плагина <a href="https://github.com/kmbang/UnityNativeEdit">UnityNativeEdit</a>.</p> <p><a href="https://github.com/mopsicus/UnityMobileInput">Исходники на Github</a></p> Unity blur effect и 2 камеры 96 https://mopsicus.ru/all/unity-blur-effect-2-cameras/ Mon, 29 Jan 2018 10:26:23 +0300 Игорь Лопатин https://mopsicus.ru/all/unity-blur-effect-2-cameras/ <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/unity-blur-effect-2-cameras.png" width="784" height="650" alt="" /> </div> <p>В этом примере, я собрал сразу два интересных момента:</p> <ol start="1"> <li>как сделать размытый фон</li> <li>как использовать сразу 2 камеры</li> </ol> <p>Для чего это может понадобиться? Например, чтобы одна камера была для игры, с настроенными пост эффектами, другая для интерфейса. Или чтобы сделать вот такой эффект размытия. В общем-то, можно и 3 камеры использовать. Зависит от потребностей и фантазии...</p> <p>Фокус в том, чтобы настроить камеру на рендер только нужного слоя.<br /> Как было сделано в этом примере:</p> <ul> <li>Объекты или контейнер которые должны быть размыты, находятся в слое <b>Blur</b></li> <li><i>Blur camera</i> рендерит только слой <b>Blur</b> (Culling Mask)</li> <li>Для <i>Main camera</i> этот слой отключён, стоит флаг <b>Depth only</b> и глубина больше, чем у Blur camera</li> <li>Ну и на Blur camera висит собственно <a href="https://github.com/QianMo/Awesome-Unity-Shader/tree/master/Volume%2015%20%E5%B1%8F%E5%B9%95%E9%AB%98%E6%96%AF%E6%A8%A1%E7%B3%8A(Gaussian%20Blur)%E7%89%B9%E6%95%88%E7%9A%84%E5%AE%9E%E7%8E%B0">скрипт размытия</a></li> </ul> <p>По такому же принципу можно одновременно и 3 камеры сделать. Если потребуется.</p> <p><a href="https://github.com/mopsicus/unity-blur-effect">Исходник на Github</a></p> Отправка письма из Unity https://mopsicus.ru/all/send-mail-unity-plugin/ https://mopsicus.ru/all/send-mail-unity-plugin/ Thu, 07 Sep 2017 16:51:54 +0300 Игорь Лопатин https://mopsicus.ru/all/send-mail-unity-plugin/ <p>Ничего особенного конечно, ничем не отличается от самого обычного плагина для <a href="http://mopsicus.ru/all/unity-ios-plugin/">iOS</a> или <a href="http://mopsicus.ru/all/unity-android-plugin/">Android</a>, но кто-то у меня спрашивал про это.<br /> Весь код умещается на одном экране, дольше демку делал :)</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/unity-send-mail-plugin.png" width="518" height="791" alt="" /> </div> <p><a href="https://github.com/mopsicus/unity-send-mail-plugin">Исходники на Github</a></p> <p>Вообще, надо бы собрать все плагины, мелочуху и выложить на гитхаб: синхронизация с iCloud, in-app покупки (не доверяю я Unity IAP :), буфер обмена, получение изображения с камеры и галереи, сохранение в галерею, push уведомления, запись в keychain, авторизация через Google Sign-in, встроенный браузер и прочее.<br /> Если что-то заинтересовало — пишите в комменты или mail@mopsicus.ru.</p> Работа в фоне в iOS и Unity https://mopsicus.ru/all/background-app-work-ios-unity/ https://mopsicus.ru/all/background-app-work-ios-unity/ Tue, 25 Jul 2017 10:22:15 +0300 Игорь Лопатин https://mopsicus.ru/all/background-app-work-ios-unity/ <p>Маленький плагин который позволяет поработать приложению в свернутом виде на iOS, некоторое время. Зачем это нужно? Например, чтобы дождаться команды с сервера и показать пользователю уведомление, что пришло время его хода.<br /> Весь плагин состоит из двух функций, которые запускают и останавливают задачу при потере фокуса.</p> <pre class="e2-text-code"><code class="">-(void) startTask { [self endTask]; if (bgTask == UIBackgroundTaskInvalid) { bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ [[UIApplication sharedApplication] endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }]; } } - (void) endTask { if (bgTask != UIBackgroundTaskInvalid) { [[UIApplication sharedApplication] endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; } [UIApplication sharedApplication].idleTimerDisabled = NO; }</code></pre><p>А в Unity это вызывается на <i>OnApplicationFocus</i>:</p> <pre class="e2-text-code"><code class="">void OnApplicationFocus (bool focusStatus) { if (focusStatus) Background.StopTask(); else Background.StartTask(); }</code></pre><p><a href="https://github.com/mopsicus/unity-ios-background-run">Ссылка на Github</a></p> Unity, iOS и IPv6 https://mopsicus.ru/all/unity-ios-ipv6-appstore-reject/ https://mopsicus.ru/all/unity-ios-ipv6-appstore-reject/ Tue, 30 May 2017 10:32:29 +0300 Игорь Лопатин https://mopsicus.ru/all/unity-ios-ipv6-appstore-reject/ <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/appstore-reject-ipv6.png" width="300" height="300" alt="" /> </div> <p>С 1 июня 2016 года, все отсылаемые приложения в AppStore должны уметь работать по <a href="https://ru.wikipedia.org/wiki/IPv6">IPv6</a>.</p> <p>Unity вроде как решили все эти вопросы еще в прошлом году. Но если погуглить, то оказывается, что некоторые получают отказы до сих пор, по тем или иным причинам связанным с IPv6. Чтобы проверить работает ли ваше приложение в сетях IPv6, Apple написали <a href="https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1">специальную статью с мануалом</a>. Я ей воспользовался и обнаружил, что приложение не коннектится к серверу :(</p> <p>Для соединения используются сокеты, поэтому код был очень простой:</p> <pre class="e2-text-code"><code class="">... private Socket _socket; public static void Connect () { _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _socket.BeginConnect(&quot;134.253.17.11&quot;, 10001, new AsyncCallback(OnEndConnect), null); } void OnEndConnect (IAsyncResult iar) { Debug.Log (&quot;connected&quot;); } ...</code></pre><p>Собственно, сразу стало понятно в чем проблема — AddressFamily должен быть <b>InterNetworkV6</b> если работаем по IPv6 или InterNetwork для IPv4.</p> <p>Если подключаться к серверу по домену, то можно воспользоваться таким <a href="https://stackoverflow.com/questions/37662255/resolve-ipv6-address-from-hostname/37676501#37676501">решением</a> — передаем хост, указываем тип, в ответ получает IPv6 или «обычный» IP адрес.</p> <p>Если же подключение осуществляется по IP адресу, то преобразование с помощью различных конвертеров в IPv6 (<a href="https://www.ultratools.com/tools/ipv4toipv6">раз</a>, <a href="http://www.ipaddressguide.com/ipv4-to-ipv6">два</a>), не дало работающего результата — сокет просто не подключался.</p> <p>Ответ был найден в том самом мануале от Apple (смотрим на подраздел <i>Use System APIs to Synthesize IPv6 Addresses</i>) и на одном <a href="http://www.codeinsect.net/2016/05/26/unity-ipv6-socket-支持">китайском сайте</a> :) Если все это объединить, то получится более-менее универсальное решение которое будет работать и по IPv6, и по IPv4, в iOS и Android.</p> <p><a href="https://github.com/mopsicus/unity-ios-ipv6-ready">Исходник на Github</a></p> SSL/TLS в Unity https://mopsicus.ru/all/ssl-tls-unity/ https://mopsicus.ru/all/ssl-tls-unity/ Mon, 13 Mar 2017 14:20:55 +0300 Игорь Лопатин https://mopsicus.ru/all/ssl-tls-unity/ <p>А сегодня мы будем шифровать весь трафик. А зачем? А чтобы усложнить жизнь читерам.</p> <p>Если у вас мультиплеер на авторитарном сервере, естественно все действия должны контролироваться на нем. Но зная, какие команды отправлять, можно легко написать бота, который автоматизирует некоторые процессы, нарушая баланс и игру «правильных» игроков. Конечно, если сильно захотеть, можно сломать все что угодно, но усложнить жизнь взломщикам и читерам тоже можно. Будем использовать SSL.</p> <p>Ничего изобретать не буду, потому что «все уже придумано до нас» :)<br /> Для теста серверной части (на node.js) и генерации ключей <a href="https://github.com/Heziode-dev/Simple-TLS-Client-Server-with-Node.js">используем эти скрипты</a>. Единственное, чего там нет — это как из сертификата и ключа сделать PFX файл:</p> <pre class="e2-text-code"><code class="">openssl pkcs12 -export -in client.crt -inkey client.key -out mycert.pfx</code></pre><p>Этот файл понадобится для клиента. Для проверки SSL соединения берем пример с сокетами с MSDN и немного переделываем его. Получаем поток и прокидываем его через SSL.</p> <pre class="e2-text-code"><code class="">IEnumerator UseSSL () { NetworkStream stream = new NetworkStream (socket); SslStream sslStream = new SslStream (stream, false, new RemoteCertificateValidationCallback (CertificateValidationCallback), new LocalCertificateSelectionCallback (CertificateSelectionCallback)); bool authenticationPassed = true; #if UNITY_EDITOR X509Certificate2 cert = new X509Certificate2(certPath, certPassword); #elif UNITY_ANDROID || UNITY_IOS WWW reader = new WWW (certPath); while (!reader.isDone) yield return null; X509Certificate2 cert = new X509Certificate2 (reader.bytes, certPassword); #endif X509Certificate2Collection certs = new X509Certificate2Collection(); certs.Add (cert); sslStream.AuthenticateAsClient (server, certs, SslProtocols.Tls, true); authenticationPassed = sslStream.IsAuthenticated; if (authenticationPassed) { /// } yield break; }</code></pre><p>Вот и весь квест. Теперь трафик между игровым сервером и клиентом зашифрован.</p> <p><a href="https://github.com/mopsicus/unity-ssl">Ccылка на Github</a></p> Добавление Google Play Services в Unity проект https://mopsicus.ru/all/plugin-google-play-services-dependencies-unity/ https://mopsicus.ru/all/plugin-google-play-services-dependencies-unity/ Mon, 30 Jan 2017 11:18:03 +0300 Игорь Лопатин https://mopsicus.ru/all/plugin-google-play-services-dependencies-unity/ <p>Прошло время ручного копирования JAR файлов и ресурсов в папку с проектом. Все плагины для Android теперь надо компилить в AAR модули. Кроме того, если в плагине реализуются какие-то функции для работы с Google сервисами, например, пуш-уведомления, сохранение в облако, или авторизация, то нужно подключать к модулю зависимости.</p> <p>Раньше (до 5 версии Unity, по-моему), в папку с проектом добавляли JAR файл со всеми Google сервисами, размером 5-6 мб, что конечно «не очень» оптимально. Теперь все сервисы разделены на отдельные AAR модули, которые хранятся в папке с SDK.</p> <p>Google сделал специальное расширение для Unity, которое само подгружает нужные модули и зависимости в проект. Достаточно указать, что вы собираетесь использовать. Это очень удобно.</p> <pre class="e2-text-code"><code class="">Google.VersionHandler.InvokeInstanceMethod( svcSupport, &quot;DependOn&quot;, new object[] { &quot;com.google.android.gms&quot;, &quot;play-services-games&quot;, &quot;10.0.1&quot; }, namedArgs: new Dictionary&lt;string, object&gt;() { {&quot;packageIds&quot;, new string[] { &quot;extra-google-m2repository&quot; } } });</code></pre><p><a href="https://github.com/googlesamples/unity-jar-resolver">https://github.com/googlesamples/unity-jar-resolver</a></p> Утилиты от Leopotam https://mopsicus.ru/all/unity-tools-leopotam/ https://mopsicus.ru/all/unity-tools-leopotam/ Fri, 02 Dec 2016 11:23:25 +0300 Игорь Лопатин https://mopsicus.ru/all/unity-tools-leopotam/ <p>Набор хороших утилит для Unity, от Leopotam. Тут и оптимизация, и анимации, и хелперы для редактора, и еще куча всего. В общем, есть что посмотреть на выходных.</p> <p><a href="https://github.com/Leopotam/LeopotamGroupLibraryUnity">https://github.com/Leopotam/LeopotamGroupLibraryUnity</a></p> Поиск по Unity репозиториям https://mopsicus.ru/all/unitylist/ https://mopsicus.ru/all/unitylist/ Tue, 09 Aug 2016 10:45:10 +0300 Игорь Лопатин https://mopsicus.ru/all/unitylist/ <p>Отличный сайт, позволяет искать в Unity репозиториях Github. Разбивка по категориям, новинки, фильтры, понятное визуальное представление. Рекомендую.</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/unitylist.png" width="950" height="529" alt="" /> </div> <p><a href="http://unitylist.com">http://unitylist.com</a></p> Unity и Git https://mopsicus.ru/all/unity-and-git/ https://mopsicus.ru/all/unity-and-git/ Mon, 21 Mar 2016 00:41:05 +0300 Игорь Лопатин https://mopsicus.ru/all/unity-and-git/ <p>Как настроить Unity для работы с Git? Как настроить Git, чтобы в репозиторий не попадали ненужные файлы?</p> <p>Из всех файлов и папок в Unity проекте, нас интересует всего две папки: <b>Assets</b> и <b>ProjectSettings</b>. В первой папке хранятся все скрипты, спрайты, анимации и прочее. Во второй — настройки проекта. Все остальные файлы можно исключить из репозитория, их сгенерирует Unity, MonoDevelop или VisualStudio.</p> <p>Добавим исключения в файл <b>.gitignore</b></p> <pre class="e2-text-code"><code class="">/[Ll]ibrary/ /[Tt]emp/ /[Oo]bj/ /[Bb]uild/ /[Bb]uilds/ /Assets/AssetStoreTools* # Autogenerated VS/MD solution and project files ExportedObj/ *.csproj *.unityproj *.sln *.suo *.tmp *.user *.userprefs *.pidb *.booproj *.svd # Unity3D generated meta files *.pidb.meta # Unity3D Generated File On Crash Reports sysinfo.txt # Builds *.apk *.unitypackage # OS generated .DS_Store .DS_Store? ._* .Spotlight-V100 .Trashes ehthumbs.db Thumbs.db</code></pre><p>Кстати, на GitHub есть <a href="https://github.com/github/gitignore">коллекция полезных .gitignore файлов</a>, вроде, постоянно обновляется и пополняется.</p> <p>Осталось настроить Unity:</p> <ul> <li>Устанавливаем <b>Hidden Meta Files</b>:<br /> Editor → Project Settings → Editor → Version Control → Mode</li> <li>Устанавливаем <b>Force Text</b>:<br /> Editor → Project Settings → Editor → Asset Serialization → Mode</li> <li>Сохраняем проект</li> </ul> <p>Теперь можно запушить свой Unity проект. Также, можно поставить расширение <a href="https://git-lfs.github.com/">Git LFS</a>, оно позволяет работать с большими файлам, даже по несколько гигабайт.</p>