#mopsicus: заметки с тегом plugin https://mopsicus.ru/tags/plugin/ об играх, разработке на Unity и личном опыте Игорь Лопатин ru E2 (v3572; Aegea) Игорь Лопатин об играх, разработке на Unity и личном опыте Разработка Unity плагинов для iOS и Android 250 https://mopsicus.ru/all/razrabotka-unity-plaginov-dlya-ios-i-android/ Tue, 05 Oct 2021 11:56:12 +0300 Игорь Лопатин https://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://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 228 https://mopsicus.ru/all/make-plugins-for-unity/ Fri, 27 Nov 2020 00:12:48 +0300 Игорь Лопатин https://mopsicus.ru/all/make-plugins-for-unity/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Плагины для Unity</h3><h4 style="display: none;" itemprop="description">Плагины для Unity</h4><img itemprop="contentUrl" src="https://mopsicus.ru/pictures/plugins.png" width="1460" height="730" alt="Плагины для Unity" /> </div> <p>Пишу статью про создание плагинов для Unity под iOS и Android. Нужны комменты и советы.</p> <p>За несколько лет, я сделал большое количество различных плагинов. Многие они не в паблике и опенсорс, но это не надолго (надеюсь :).</p> <p>Есть куча ситуаций когда одной Unity недостаточно и нужно использовать возможности платформы. Банально, но до сих пор, в Unity нет работы с галерей и камерой из коробки :) Смешно? Не очень. В Xamarin есть, а в Unity нет.</p> <p>Для многих менее опытных разработчиков, создание плагина для Unity под мобильную платформу кажется чем-то сложным, но на деле, это не так сложно и страшно. По крайней мере, организовать простое взаимодействие — достаточно просто. В статье, будет шаблон для Android (на Java) и iOS (на Obj-C) для создания плагинов и их связи с Unity приложением.</p> <p>Поэтому вопрос: о создании каких плагинов вы бы хотели прочитать в первую очередь? Примеры: галерея, уведомления, браузер, покупки, шаринг, [продолжите]...</p> Sign in with Apple, Google Sign-In и Unity 214 https://mopsicus.ru/all/sign-in-with-apple-google-sign-in-i-unity/ Mon, 17 Aug 2020 16:28:09 +0300 Игорь Лопатин https://mopsicus.ru/all/sign-in-with-apple-google-sign-in-i-unity/ <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Sign in with Apple and Unity</h3><h4 style="display: none;" itemprop="description">Sign in with Apple and Unity</h4><img itemprop="contentUrl" src="https://mopsicus.ru/pictures/sign-in.png" width="768" height="432" alt="Sign in with Apple and Unity" /> </div> <p>Решили мы сделать «доброе» дело нашим пользователям: позволить и на Android и на iOS использовать Google Sign-In и Sign in with Apple, и там и там.</p> <p>Пришлось немного поковыряться, но получилось! Плагин для Unity работает. Разобраться во всём помогли две статьи:</p> <ul> <li><a href="https://johncodeos.com/how-to-add-sign-in-with-apple-button-to-your-android-app-using-kotlin/">How to add ‘Sign in with Apple’ button to your Android app using Kotlin</a></li> <li><a href="https://habr.com/ru/company/cian/blog/475062/">Внедряем Sign in with Apple — систему авторизации от Apple</a></li> <li>Ну и немного, официальные доки</li> </ul> <p>Плагин из примера на Kotlin, переписал на Java, так привычней, но наверное, уже пора осваивать и его... :( Apple не сделали SDK для других платформ, так что там всё не красиво, но работает. У Google, прописываешь в pod файл Google Sign-in и используешь.</p> <p>В общем, mission complete. Если есть вопросы, пишите.</p> Firebase под контролем 184 https://mopsicus.ru/all/firebase-under-control-plugin-android-aar/ Mon, 25 Nov 2019 15:41:44 +0300 Игорь Лопатин https://mopsicus.ru/all/firebase-under-control-plugin-android-aar/ <p><i>Обновлено: 16.10.2020</i><br /> <i>С последними версиями FB этот фокус не работает :(</i><br /> <i>Точнее инициализация работает когда апп активен, но при выключенном приложении пуши не приходят, FirebaseInitProvider не инициализируется. Разбираюсь...</i></p> <div class="e2-text-picture"> <h3 style="display: none;" itemprop="name">Firebase Android</h3><h4 style="display: none;" itemprop="description">Firebase Android</h4><img itemprop="contentUrl" src="https://mopsicus.ru/pictures/firebase-android-plugin.png" width="512" height="288" alt="Firebase Android" /> </div> <p>У меня есть плагин для Unity, который отвечает за уведомления, как локальные так и PUSH. Firebase даёт файлик <b>google-services.json</b>, который нужно добавить в Android проект или плагин, и при сборке, уже Gradle плагин прочитает из этого файла, создаст XML и позже Firebase будет инициализироваться автоматически в приложении.</p> <p>Но, хотелось бы, чтобы плагин был один и его можно было импортировать в другие проекты, не пересобирая его каждый раз с новый JSON файлом. Думал это будет некоторой проблемой и придётся придумывать костыли, но оказалось всё проще.</p> <p>Можно инициализировать Firebase вручную с нужными параметрами. Т. е. всё что лежит в JSON файле, можно передать в конструктор и оно будет работать. Для этого, надо добавить в манифест:</p> <pre class="e2-text-code"><code class="">&lt;provider android:name=&quot;com.google.firebase.provider.FirebaseInitProvider&quot; android:authorities=&quot;${applicationId}.firebaseinitprovider&quot; tools:node=&quot;remove&quot; /&gt;</code></pre><p>Теперь Firebase автоматически не инициализируется. А чтобы сделать это самому, в плагине, при старте Unity приложения будет вызываться функция с конструктором и нужными параметрами уже из конфига игры или приложения:</p> <pre class="e2-text-code"><code class="">FirebaseOptions.Builder builder = new FirebaseOptions.Builder() .setApplicationId(&quot;your_app_id&quot;) .setApiKey(&quot;your_api_key&quot;) .setDatabaseUrl(&quot;your_link_to_db&quot;) .setStorageBucket(&quot;your_storage-url&quot;); FirebaseApp.initializeApp(this, builder.build());</code></pre><p>Теперь нет необходимости каждый раз билдить плагин для уведомлений. Ура.</p> Уведомления в Unity 173 https://mopsicus.ru/all/unity-local-notifications/ Thu, 05 Sep 2019 11:40:13 +0300 Игорь Лопатин https://mopsicus.ru/all/unity-local-notifications/ <div class="lazy" data-expose="true" data-effect="relax"><div class="e2-text-video"> <iframe src="https://www.youtube.com/embed/XjxRL7Ax9-I" frameborder="0" allowfullscreen></iframe></div></div> <p>Юнитеки всё никак не могут сделать нормальный плагин для управления уведомлениями :( Вот и сейчас, вроде что-то новое и вроде даже удобное, но нет возможности принимать push сообщения с сервера. Почему? Это же фича которая используется почти во всех онлайн играх.</p> <p>Так и придётся пока использовать нативные самописные плагины, печаль...</p> <p><a href="https://ole.unity.com/MobileProject">Исходники примера</a></p> Плагины VS Code для Unity 159 https://mopsicus.ru/all/vs-code-plugins-unity/ Fri, 05 Apr 2019 17:50:41 +0300 Игорь Лопатин https://mopsicus.ru/all/vs-code-plugins-unity/ <p>Уже довольно долгое время я пользуюсь VS Code и он, до сих пор меня не разочаровал :) Это отличный быстрый редактор с кучей разнообразных плагинов. Для работы с Unity использую вот эти:</p> <h2><a href="https://marketplace.visualstudio.com/items?itemName=Unity.unity-debug">Debugger for Unity</a></h2> <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/vscode-debugger-list.png" width="600" height="489" alt="" /> </div> <p>В общем-то, нет смысла придумывать сложное описание, обычный дебагер и он работает. Можно конечно отлаживать и через Debug.Log :) Можно, но не нужно.</p> <h2><a href="https://marketplace.visualstudio.com/items?itemName=Leopotam.csharpfixformat">C# FixFormat</a></h2> <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/leopotam-csharpfix.gif" width="600" height="468" alt="" /> </div> <p>Эта штука must have, сколько времени она сэкономила сложно посчитать. Форматирует C# код со всеми отступами и переносами. Товарищ <a href="https://leopotam.com">Leopotam</a> постарался.</p> <h2><a href="https://marketplace.visualstudio.com/items?itemName=k--kato.docomment">C# XML Documentation Comments</a></h2> <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-docomment.gif" width="967" height="557" alt="" /> </div> <p>Плагин для генерации XML комментариев, нужно ввести только 3 слеша и IntelliSense всё расскажет о методе или классе.</p> <h2><a href="https://marketplace.visualstudio.com/items?itemName=eppz.eppz-code">eppz! (C# theme for Unity)</a></h2> <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/eppz-theme.png" width="727" height="727" alt="" /> </div> <p>Это не плагин, а тема оформления. Приятная цветовая гамма в пастельных тонах, для любителей тёмных тем.</p> <h2><a href="https://marketplace.visualstudio.com/items?itemName=kleber-swf.unity-code-snippets">Unity Code Snippets</a></h2> <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-snippets.gif" width="1082" height="758" alt="" /> </div> <p>Плагин с коллекцией Unity сниппетов. Позволяет быстро сгенерировать метод с параметрами.</p> <p>А ещё, я поставил себе <a href="https://github.com/tonsky/FiraCode/wiki/VS-Code-Instructions">шрифт Fira code с лигатурами</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> 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> Riddut. Возвращение. 99 https://mopsicus.ru/all/riddut-returns/ Sat, 03 Feb 2018 21:22:31 +0300 Игорь Лопатин https://mopsicus.ru/all/riddut-returns/ <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/riddut-image.png" width="610" height="550" alt="" /> </div> <p>В 2015 году я сделал для себя небольшой плагин для браузера — он вырезал из ленты ВК и ФБ ненужные мне записи по стоп-словам. Всё работало очень просто: находил в ленте слово и удалял пост.</p> <p>Потом, я добавил поддержку морфологии, чтобы не добавлять кучу слов с разными окончаниями. Ещё скрипт научился удалять контекстную рекламу и фильтровать выдачу поисковых систем. И итогом стала — фильтрация любого сайта. Иногда от этого страдает вёрстка, но оно того стоит. Новостной сайт после фильтра хоть можно читать...</p> <p>После этого, я успешно про него забыл. И вот 2018 год: выборы, санкции, олимпийцы — пришло время снова очистить своё информационного пространство от, и смахнуть пыль со старого кода.</p> <p class="loud">Riddut</p> <p>Так называется расширение. Да, оно ограждает от нескончаемого потока информационного шума. Это такой персональный AdBlock для контента.<br /> Вот что умеет:</p> <ul> <li>удалять любое упоминание стоп-слова на любом сайте</li> <li>удалять посты и рекламу из соц. сетей Фейсбук, ВКонтакте, Одноклассники, Твиттер по ключевым словам</li> <li>удалять позиции в выдаче и рекламу поисковых систем Яндекс, Гугл, Бинг</li> <li>фильтровать дозагруженный контент</li> <li>работать с белыми списками сайтов</li> <li>понимать русскую и английскую морфологию (не полностью)</li> <li>синхронизироваться между браузерами</li> <li>показывать красивую статистику «сэкономленного» времени :_)</li> </ul> <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/riddut-how-to.jpg" width="914" height="289" alt="" /> </div> <p>Сейчас всё это дело в бета версии, так что, если расширение окажется вам полезным — напишите на <a href="mailto:mail@mopsicus.ru">mail@mopsicus.ru</a>, что добавить, убрать, исправить, улучшить. Захотите поучаствовать? Буду рад.</p> <p>Есть версии для Chrome, Safari и Opera. С Firefox пока не разобрался в чём проблема, но думаю решу.</p> <p>Подробнее на <a href="https://riddut.mopsicus.ru">https://riddut.mopsicus.ru</a></p> <p class="foot">Заметка чтобы попереживать. Да, расширение отправляет на сайт слова, чтобы с помощью библиотеки морфологии, получить в ответ все его формы и отфильтровать страницу. Ещё оно скачивает актуальные данные по вёрстке. Это всё. В любом случае, всё что отправляет и получает расширение можно посмотреть через консоль. Если вас это не устраивает, что ж, вы можете не использовать моё расширение :)</p> <p><b>Riddut</b> — это не баннерорезалка. Удаление некоторой рекламы, это приятный бонус, а не основная функция. Но вы легко можете использовать и то и другое вместе.</p> Unity android plugin + onActivityResult 95 https://mopsicus.ru/all/unity-android-plugin-onactivityresult/ Thu, 25 Jan 2018 11:15:53 +0300 Игорь Лопатин https://mopsicus.ru/all/unity-android-plugin-onactivityresult/ <p>Автор приводит пример, как он решил <a href="https://medium.com/@tarasleskiv/unity-android-plugins-and-onactivityresult-callback-abef4b6bbc87">вопрос с обработкой onActivityResult</a> в андроидах плагинах для Unity. Создаёт отдельный активити, там перехватывает и завершает. Норм решение.</p> <p>Ещё можно сделать специальный плагин который будет наследоваться от <i>UnityPlayerActivity</i> и прописать его в манифесте, чтобы он запускался первым. Там тоже можно переопределить onActivityResult.</p> <p>Ну и ещё как вариант, запускать во фрагменте (fragment) и обрабатывать там.</p> 5 полезных ассетов и библиотек для Unity #2 76 https://mopsicus.ru/all/assets-list-2/ Wed, 25 Oct 2017 11:40:59 +0300 Игорь Лопатин https://mopsicus.ru/all/assets-list-2/ <h2>1. Unity Loop Component [<a href="https://github.com/Mr-Alan/UnityGameLoopCallbackManager">Ссылка</a>]</h2> <p>Небольшая библиотека которая позволяет повесить хук на события <i>Update, LateUpdate, FixedUpdate, OnRenderObject</i> и другие.</p> <h2>2. UIEffect [<a href="https://github.com/mob-sakai/UIEffect">Ссылка</a>]</h2> <p>Коллекция эффектов для uGUI. Позволяет быстро добавить около десятка различных эффектов для интерфейса своей игры или приложения: размытие, пикселизация, сепия и т. д.</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/UIEffect-preview.gif" width="320" height="375" alt="" /> </div> <h2>3. Расширение для MemoryProfiler [<a href="https://github.com/robertoardila/support-unity-memoryprofiler">Ссылка</a>]</h2> <p>Такое расширение для <a href="https://bitbucket.org/Unity-Technologies/memoryprofiler">расширения</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/memoryprofiler-treeview.jpg" width="2560" height="1065.5234012147" alt="" /> </div> <h2>4. NaughtyAttributes [<a href="https://github.com/dbrizov/NaughtyAttributes">Ссылка</a>]</h2> <p>Хорошее расширение для инспектора 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/reorderablelist-inspector.gif" width="455" height="215" alt="" /> </div> <h2>5. The Stack [<a href="https://github.com/llapuras/the-Stack">Ссылка</a>]</h2> <p>В завершении не ассет, а демка популярной игры <i>Stack</i>. Полезно для новичков, можно подглядеть как делаются такие простые, но в тоже время залипательные игры :)</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> Система плагинов для iOS и Android https://mopsicus.ru/all/ios-android-unity-plugin-system/ https://mopsicus.ru/all/ios-android-unity-plugin-system/ Fri, 10 Feb 2017 15:31:51 +0300 Игорь Лопатин https://mopsicus.ru/all/ios-android-unity-plugin-system/ <p>Простая система плагинов для мобилок. Контроллер инициализирует все плагины и обрабатывает приходящие сообщения. Обмен данными в формате JSON.</p> <p>Вообще, печаль конечно, что Unity не реализует даже самые простые варианты работы с мобильными платформами, тот же браузер или камера. Может когда-нибудь...</p> <p><a href="https://github.com/mopsicus/unity-plugin-system">Ссылка на Github</a></p> Как убрать InputBox в Android над клавиатурой https://mopsicus.ru/all/hide-mobile-input-android-unity/ https://mopsicus.ru/all/hide-mobile-input-android-unity/ Fri, 30 Dec 2016 16:30:05 +0300 Игорь Лопатин https://mopsicus.ru/all/hide-mobile-input-android-unity/ <p><i>Обновлено 04.10.2018</i><br /> <i>Моя <a href="https://mopsicus.ru/all/unity-mobile-input-plugin/">версия «unity mobile input»</a> для iOS и Android.</i></p> <p>Если вы не знаете, о чем речь, то эта заметка не для вас :)</p> <p>Другие же, наверняка гуглили «unity hide mobile input». И не находили стандартного решения — потому что его нет. Все написано <a href="https://docs.unity3d.com/ScriptReference/TouchScreenKeyboard-hideInput.html">в документации</a>:</p> <blockquote> <p>Note: Android: only TouchScreenKeyboard.visible input field is supported, hence this value is always false.</p> </blockquote> <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/inputfield-unity.png" width="540" height="960" alt="" /> </div> <p>Конечно, пользовательский ввод в играх нужно сводить к нулю, но бывают исключения. Ради такого исключения, чтобы избавиться от панели над клавиатурой, я сделал этот плагин.</p> <p>Идея в том, что на экран добавляется нативное невидимое поле ввода откуда потом забирается текст. Все просто. Да, это не изящное решение, а грязный хак, но он работает — верхнего поля ввода нет и появляется стандартная клавиатура Android или iOS. Если к этому добавить ассет <b>Text Mesh Pro</b>, то будут еще и эмоджи. Да, еще не видно курсора. Я думаю над этим... :)</p> <div class="lazy" data-expose="true" data-effect="relax"><div class="e2-text-video"> <iframe src="https://www.youtube.com/embed/g2YR_NDA7i8" frameborder="0" allowfullscreen></iframe></div></div> <p>Если есть более красивое решение — киньте ссылку :)</p> <p><a href="https://github.com/mopsicus/unity-keyboard-hack">Ссылка на Github</a></p> Unity share плагин для iOS и Android https://mopsicus.ru/all/unity-share-plugin-ios-android/ https://mopsicus.ru/all/unity-share-plugin-ios-android/ Tue, 19 Jul 2016 13:11:15 +0300 Игорь Лопатин https://mopsicus.ru/all/unity-share-plugin-ios-android/ <p>Каждый разработчик пытается автоматизировать процесс. В результате, создаются собственные движки, врапперы, надстройки, «велосипеды» и т. д... Так и получилось, нужно было сделать более-менее универсальный способ шаринга в Unity проекте для андроидов и айфонов, в результате написал эти два плагина. Теперь запросы типа: «как расшарить из Unity», «unity share plugin», «как отправить вконтакте из unity» должны вести сюда :)</p> <p>Использовать очень просто. Есть небольшие заморочки с настройкой проекта под iOS, но это делается один раз и автоматически, с помощью <a href="http://mopsicus.ru/all/add-files-frameworks-ios-build/">обработки проекта после билда</a>. Можно добавлять, изменять и использовать как угодно, все исходники и пример на Github.</p> <p>В данный момент можно шарить в:</p> <ul> <li>ВКонтакте</li> <li>Facebook</li> <li>Twitter</li> <li>Одноклассники</li> <li>WhatsApp</li> <li>Viber</li> <li>Telegram</li> </ul> <p>Интерфейс в Unity выглядит так:</p> <pre class="e2-text-code"><code class="">// vk, fb, ok, tw, wa, vb, tg using UnityEngine; using System.Collections; using System.Runtime.InteropServices; public class Sharing : MonoBehaviour { #if UNITY_IOS [DllImport (&quot;__Internal&quot;)] private static extern void shareVia (string app, string message, string url, string param); #endif // Поделиться public static void ShareVia (string app, string message, string param = &quot;&quot;) { #if UNITY_ANDROID message = string.Format (&quot;{0} {1}&quot;, message, &quot;http://my.url.com&quot;); // добавление ссылки using (var plugin = new AndroidJavaClass(&quot;com.mycompany.sharing.Plugin&quot;)) { plugin.CallStatic(&quot;shareVia&quot;, app, message); } #elif UNITY_IOS shareVia (app, message, &quot;http://my.url.com&quot;, param); #endif } // Не удалось расшарить void OnShareError (string result) { switch (result) { case &quot;NotInstall&quot;: // приложение не установлено break; case &quot;NotAvailable&quot;: // шаринг не доступен break; case &quot;AccessDenied&quot;: // нет доступа break; default: // не удалось расшарить текст break; } } }</code></pre><p>Например, чтобы расшарить в Facebook, достаточно вызвать:</p> <pre class="e2-text-code"><code class="">Sharing.ShareVia (&quot;fb&quot;, &quot;Hi from Unity&quot;);</code></pre><p>Для работы некоторых API, нужны ID приложений. Чтобы их получить, необходимо создать приложения для этих соц. сетей, как это сделать обычно написано в специальном разделе для разработчиков на сайте. Например, как <a href="https://vk.com/dev/mobile_apps">для ВКонтакте</a>.</p> <p>Внутренности каждого плагина тут расписывать не буду, исходники все доступны, если будут вопросы пишите — почта внизу страницы.</p> <p><a href="https://github.com/mopsicus/unity-share-plugin-ios-android">Исходник на Github</a></p> Unity iOS plugin https://mopsicus.ru/all/unity-ios-plugin/ https://mopsicus.ru/all/unity-ios-plugin/ Wed, 04 May 2016 11:31:31 +0300 Игорь Лопатин https://mopsicus.ru/all/unity-ios-plugin/ <p>Так как тема мобильной разработки на Unity для меня сейчас актуальна, то продолжу про создание плагинов. Как сделать свой плагин для iOS? Что можно делать с помощью нативных плагинов? Например, показать стандартный ActionSheet или отобразить HTML, или синхронизироваться с iCloud, или получить доступ к галереи картинок опять же... Чтобы сделать простой плагин и xCode не обязателен, на самом деле.</p> <p>Для примера, сделаем плагин который отображает браузер и загружает какую-нибудь страницу внутри Unity приложения. Плагин будет состоять всего из <b>одного</b> файла, с расширением <i>.mm</i>. В <a href="http://docs.unity3d.com/Manual/PluginsForIOS.html">документации</a> есть список форматов и описание сборки под iOS.</p> <p>Для начала, объявим главный контроллер Unity приложения:</p> <pre class="e2-text-code"><code class="">extern UIViewController *UnityGetGLViewController();</code></pre><p>Для примера будет достаточно трех функций: показа браузера, загрузки страницы, скрытия браузера.</p> <pre class="e2-text-code"><code class="">- (void)showBrowser { CGRect screenRect = [[UIScreen mainScreen] bounds]; webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, screenRect.size.width, screenRect.size.height)]; [UnityGetGLViewController().view addSubview:webView]; } - (void)loadUrl:(NSString *)url { [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]]; } - (void)close { [webView removeFromSuperview]; webView = NULL; }</code></pre><p>Функция <b>showBrowser</b> добавляет браузер на главный экран, растягивая по высоте и ширине. При желании, в функцию можно передавать отступы, чтобы показывать браузер там где нужно.</p> <p>Ну и последнее, интерфейс доступа на C:</p> <pre class="e2-text-code"><code class="">static Browser *browser = NULL; extern &quot;C&quot; { void browserLaunch () { if (browser == NULL) browser = [[Browser alloc] init]; [browser showBrowser]; } void browserLoadUrl (const char* url) { [browser loadUrl:[NSString stringWithUTF8String:url]]; } void browserClose () { [browser close]; } }</code></pre><p>Это все, плагин готов! Теперь осталось вызывать эти функции из Unity. По аналогии с Android плагином, делаем класс для браузера. Все функции подключаем через <b>[DllImport («__Internal»)]</b>, должно получиться что-то такое:</p> <pre class="e2-text-code"><code class="">using UnityEngine; using System.Collections; using System.Runtime.InteropServices; public class Browser : MonoBehaviour { #if UNITY_IPHONE [DllImport (&quot;__Internal&quot;)] private static extern void browserLaunch (int left, int right, int top, int bottom); [DllImport (&quot;__Internal&quot;)] private static extern void browserLoadUrl (string url); [DllImport (&quot;__Internal&quot;)] private static extern void browserClose (); #endif // Показываем браузер public static void Launch (RectOffset offset) { #if UNITY_IPHONE browserLaunch (offset.left, offset.right, offset.top, offset.bottom); #endif } // Открыть страницу public static void LoadUrl (string url) { #if UNITY_IPHONE browserLoadUrl (url); #endif } // Убрать браузер public static void Close () { #if UNITY_IPHONE browserClose (); #endif } }</code></pre><p>Тут нужно уточнить, что браузер будет добавлен на главный экран, <b>поверх всего</b>. Поэтому, нужно правильно высчитать отступы, чтобы все выглядело красиво. В примере значения отступов грубо прописаны в коде, так делать не стоит :)</p> <p><a href="https://github.com/mopsicus/native-ios-browser-unity">Исходники на GitHub</a></p> Unity native camera https://mopsicus.ru/all/unity-native-camera/ https://mopsicus.ru/all/unity-native-camera/ Mon, 25 Apr 2016 11:08:31 +0300 Игорь Лопатин https://mopsicus.ru/all/unity-native-camera/ <p>Как получить изображение с камеры или из галереи с помощью Unity?</p> <p>Если загуглить этот запрос, то на первых местах в выдаче скорее всего будут Unity Answers и Stackoverflow. И если походить по ссылкам, то они зачастую ссылаются друг на друга и в итоге, кто-нибудь кинет ссылку на Unity Asset Store.</p> <p>В Asset Store на самом деле, много отличных плагинов которые справляются с этой задачей, и платных, и бесплатных. Но мало, которые бы «точечно» решали одну задачу, а не были большими паками, например как <a href="https://www.assetstore.unity3d.com/en/#!/content/10825">плагины от Stan</a>. Ведь часто в приложении необходимо работать только с PUSH уведомлениями или получать картинку с камеры, а все остальное не требуется...</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/native-camera-unity.png" width="2160" height="3840" alt="" /> </div> <p>В общем, <a href="http://mopsicus.ru/all/unity-android-plugin/">читаем</a> предыдущую заметку, гуглим код получения и сохранения картинки для Android (надо отрефакторить конечно, в примере вырезанный откуда-то фрагмент :) и получаем плагин для работы с камерой в Unity.</p> <p>Не забываем добавить в манифест необходимые разрешения.</p> <p><a href="https://github.com/mopsicus/native-android-camera-unity">Исходники на GitHub</a></p> Unity Android plugin https://mopsicus.ru/all/unity-android-plugin/ https://mopsicus.ru/all/unity-android-plugin/ Tue, 12 Apr 2016 10:44:31 +0300 Игорь Лопатин https://mopsicus.ru/all/unity-android-plugin/ <p>Как часто можно встретить на stackoverflow вопросы, про доступ к галереи картинок, или как получить снимок с камеры, или как показать браузер, или как работать с Play Services... Да что уж, я и сам задавал такие вопросы. А всё потому, что к сожалению, в Unity нет (пока) многих специфичных функций, которые зависят от платформы. Но есть возможность подключать нативные плагины, что очень хорошо. С помощью плагинов, можно организовать любое взаимодействие которое поддерживается платформой.</p> <p>Раньше, плагины можно было компилировать в JAR файлы, закидывать в папку <i>Assets/Plugins/Android</i> и использовать. В общем-то, так можно делать и сейчас, но это подойдет для самых простых плагинов, не использующих ресурсы, которые нужно сохранять в папку <i>res</i>. А на такие вещи Unity стала ругаться и выдавать сообщение в консоль:</p> <blockquote> <p>OBSOLETE — Providing Android resources in Assets/Plugins/Android/res is deprecated, please move your resources to an Android Library. See «Building Plugins for Android» section of the Manual.</p> </blockquote> <p>Короче, надо делать Android Library. Если интересует, как сделать плагин по «старой технологии», могу рассказать, а пока — как надо.</p> <h2>Шаг 1.</h2> <p>Скачиваем Android Studio и Android SDK. Тут особых проблем возникнуть не должно.</p> <h2>Шаг 2.</h2> <p>Создаем новый Android Project. Далее, создаем новый модуль: File → New → New Module → Android Library</p> <h2>Шаг 3.</h2> <p>Скопируем JAR файл с классами Unity в папку <i>libs</i> нового модуля. И добавим в раздел с зависимостями Gradle файла строку с классами Unity. Где искать файл <b>classes.jar</b> можно <a href="http://docs.unity3d.com/Manual/PluginsForAndroid.html">прочитать в документации</a>.</p> <pre class="e2-text-code"><code class="">dependencies { provided files('libs/classes.jar') ... }</code></pre><h2>Шаг 4.</h2> <p>Для примера сделаем плагин который показывает всплывающие сообщения, тосты (Toast). Создадим новый класс <i>Plugin</i> и добавим туда один метод <b>show</b> с параметром <b>message</b>. Не самый удачный пример, потому что не используются ресурсы, но самый простой.</p> <pre class="e2-text-code"><code class="">package com.mycompany.toast; import com.unity3d.player.UnityPlayer; import android.widget.Toast; public class Plugin { // Показать сообщение static void show(final String message) { UnityPlayer.currentActivity.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(UnityPlayer.currentActivity, message, Toast.LENGTH_SHORT).show(); } }); } }</code></pre><h2>Шаг 5.</h2> <p>В Android Studio, справа в меню Gradle, ищем название модуля которое задали при создании и далее: Tasks → build → assembleRelease. Модуль скомпилируется в <b>AAR файл</b>, то что и нужно.</p> <h2>Шаг 6.</h2> <p>Копируем AAR плагин в папку <i>Assets/Plugins/Android</i> с Unity проектом. И пишем небольшой интерфейс для вызова функции <b>show</b>.</p> <pre class="e2-text-code"><code class="">using UnityEngine; using System.Collections; public class Toast : MonoBehaviour { // Показываем всплывающее сообщение public static void Show (string message) { #if UNITY_ANDROID using (var plugin = new AndroidJavaClass(&quot;com.mycompany.toast.Plugin&quot;)) { plugin.CallStatic(&quot;show&quot;, message); } #endif }</code></pre><h2>Шаг 7.</h2> <p>Закидываем приложение на Android устройство и проверяем. Все должно работать.</p> <p>Это конечно не самый интересный пример, в следующей заметке напишу как получить изображение с камеры или альбома и использовать его в Unity. Или как отобразить HTML страницу в браузере...</p>