Buffer icon Проекты
44 заметки с тегом

ios

Позднее Ctrl + ↑

Публикация тормозит на «Authenticating with the iTunes store»

Эта довольно распространенная «проблема» известная уже несколько лет! На stackoverflow предложено куча вариантов: от просто подождать (что кстати иногда работает), до смены WiFi сети, запуска одновременно нескольких Application Loader’ов и другого шаманства.

Столкнулся с этим делом дважды. Первый раз как-то само разрешилось — подождал около 5 минут, второй раз ничего не помогало. Гугл подсказал, что наиболее часто работающий метод — это удалить и заново загрузить iTunes Store’s Transporter.

Для этого в терминале выполняем следующие команды:

cd ~
mv .itmstransporter/ .old_itmstransporter/ // сохраняем предыдущую версию, на всякий случай
rm -rf ~/.itmstransporter/ // или удаляем если не нужен 
"/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/itms/bin/iTMSTransporter"

Нужно будет подождать немного, но после обновления, все сработало и загрузилось очень быстро.

Unity, iOS и IPv6

С 1 июня 2016 года, все отсылаемые приложения в AppStore должны уметь работать по IPv6.

Unity вроде как решили все эти вопросы еще в прошлом году. Но если погуглить, то оказывается, что некоторые получают отказы до сих пор, по тем или иным причинам связанным с IPv6. Чтобы проверить работает ли ваше приложение в сетях IPv6, Apple написали специальную статью с мануалом. Я ей воспользовался и обнаружил, что приложение не коннектится к серверу :(

Для соединения используются сокеты, поэтому код был очень простой:

...
private Socket _socket;
 
public static void Connect () {
    _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    _socket.BeginConnect("134.253.17.11", 10001, new AsyncCallback(OnEndConnect), null);
}
 
void OnEndConnect (IAsyncResult iar) {
    Debug.Log ("connected");
}
...

Собственно, сразу стало понятно в чем проблема — AddressFamily должен быть InterNetworkV6 если работаем по IPv6 или InterNetwork для IPv4.

Если подключаться к серверу по домену, то можно воспользоваться таким решением — передаем хост, указываем тип, в ответ получает IPv6 или «обычный» IP адрес.

Если же подключение осуществляется по IP адресу, то преобразование с помощью различных конвертеров в IPv6 (раз, два), не дало работающего результата — сокет просто не подключался.

Ответ был найден в том самом мануале от Apple (смотрим на подраздел Use System APIs to Synthesize IPv6 Addresses) и на одном китайском сайте :) Если все это объединить, то получится более-менее универсальное решение которое будет работать и по IPv6, и по IPv4, в iOS и Android.

Исходник на Github

Баг в userInfo NotificationItem [iOS]

Если вы работаете с пуш уведомлениями в iOS и делаете это стандартными средствами Unity, то при обработке уведомления у вас могут возникнуть сложности с цифровыми значениями. Видимо Unity сам преобразует их в Int64. В тоже время, с текстовыми полями все в порядке.
Чтобы получить «нормальное» цифровое значение из пуша и преобразовать в Int, можно воспользоваться таким способом:

...
int my_int_value = 0;
object data = push.userInfo["my_int_value"];
if (data is Int64)
	my_int_value = ConvertInt64ToInt32((Int64)data);
...
// Convert function
int ConvertInt64ToInt32 (Int64 val) {
	return (int)(val & 0xFFFFFFFF);
}

Но как показывает практика, лучше использовать нативный плагин :)

 Нет комментариев    199   2017   ios   unity   с#

10+ ссылок для самостоятельного продвижения игры

ASO: как увеличить установки игры на 53% в день за счет оптимизации названия и описания в Google Play

https://blog.appfollow.ru/aso-как-увеличить-установки-игры-на-53-в-день-за-счет-оптимизации-названия-и-описания-в-google-9fc3d38e18c

Пошаговый алгоритм работы с ASO

https://habrahabr.ru/company/miip/blog/313804/

Итак, вы создали игру. Что дальше?

https://habrahabr.ru/post/324702/

Сколько заработает ваша мобильная игра?

https://habrahabr.ru/company/miip/blog/322552/

Продвижение вашей инди-игры: самые важные нюансы, о которых никто не знает

https://habrahabr.ru/post/257379/

100 и 1 инструмент для маркетинга и монетизации

http://apptractor.ru/marketing

Как бесплатно исследовать целевую аудиторию вашей новой игры

http://apptractor.ru/measure/user-analytics/kak-besplatno-issledovat-tselevuyu-auditoriyu-vashey-novoy-igryi.html

Как провести маркетинговый анализ? Руководство от Ильи Еремеева из Game Insight

http://app2top.ru/marketing/kak-provesti-marketingovy-j-analiz-rukovodstvo-ot-il-i-eremeeva-iz-game-insight-95389.html

Продвижение мобильных приложений: выученные уроки

https://habrahabr.ru/company/enterra/blog/295774/

Подкасты Галенкина

http://galyonkin.com

Подборка англоязычных ресурсов, нужных для продвижения игры

http://app2top.ru/marketing/poleznoe-podborka-ssy-lok-po-marketingu-dlya-mobil-ny-h-razrabotchikov-82746.html

Система плагинов для iOS и Android

Простая система плагинов для мобилок. Контроллер инициализирует все плагины и обрабатывает приходящие сообщения. Обмен данными в формате JSON.

Вообще, печаль конечно, что Unity не реализует даже самые простые варианты работы с мобильными платформами, тот же браузер или камера. Может когда-нибудь...

Ссылка на Github

Emoji в Unity

Обновлено 09.11.2021
Можно использовать готовый пакет для работы с эмоджи. Отличие в том, что не нужно создавать шрифт, спрайты будут браться из атласа.

Как добавить поддержку эмоджи в Unity? К сожалению, решения из коробки нет. Но есть самый лучший ассет для работы с текстом Text Mesh Pro. Да, он не дешевый, но он этого стоит. Может когда-нибудь Unity его купит, и это будет стандартным решением, как они сделали с Anima2D.

В версии TMP, которая скоро должна пойти в релиз, разработчик добавил поддержку Emoji. Точнее, можно делать свои атласы, юникод эмоджи будет автоматически заменяться на картинку. Чтобы были доступны все эмоджи, нужен большой атлас. Я использовал EmojiOne. Также понадобится одна отличная программа — TexturePacker и расширение для Unity TexturePacker Importer.

  1. Загружаем все эмоджи в программу и экспортируем в формат Unity — Texture2D sprite sheet.
  2. После этого меняем Data format на JSON (Array) и делаем экспорт еще раз.
  3. Теперь полученные три файла: Emoji.png, Emoji.json и Emoji.tpsheet загружаем в Unity.

Осталось с помощью TMP Sprite Importer сгенерировать атлас для Text Mesh Pro. В результате, на iOS и Android можно использовать эмоджи.

 3 комментария    3157   2017   android   ios   unity   интерфейс

Как убрать InputBox в Android над клавиатурой

Обновлено 04.10.2018
Моя версия «unity mobile input» для iOS и Android.

Если вы не знаете, о чем речь, то эта заметка не для вас :)

Другие же, наверняка гуглили «unity hide mobile input». И не находили стандартного решения — потому что его нет. Все написано в документации:

Note: Android: only TouchScreenKeyboard.visible input field is supported, hence this value is always false.

Конечно, пользовательский ввод в играх нужно сводить к нулю, но бывают исключения. Ради такого исключения, чтобы избавиться от панели над клавиатурой, я сделал этот плагин.

Идея в том, что на экран добавляется нативное невидимое поле ввода откуда потом забирается текст. Все просто. Да, это не изящное решение, а грязный хак, но он работает — верхнего поля ввода нет и появляется стандартная клавиатура Android или iOS. Если к этому добавить ассет Text Mesh Pro, то будут еще и эмоджи. Да, еще не видно курсора. Я думаю над этим... :)

Если есть более красивое решение — киньте ссылку :)

Ссылка на Github

Unity share плагин для iOS и Android

Каждый разработчик пытается автоматизировать процесс. В результате, создаются собственные движки, врапперы, надстройки, «велосипеды» и т. д... Так и получилось, нужно было сделать более-менее универсальный способ шаринга в Unity проекте для андроидов и айфонов, в результате написал эти два плагина. Теперь запросы типа: «как расшарить из Unity», «unity share plugin», «как отправить вконтакте из unity» должны вести сюда :)

Использовать очень просто. Есть небольшие заморочки с настройкой проекта под iOS, но это делается один раз и автоматически, с помощью обработки проекта после билда. Можно добавлять, изменять и использовать как угодно, все исходники и пример на Github.

В данный момент можно шарить в:

  • ВКонтакте
  • Facebook
  • Twitter
  • Одноклассники
  • WhatsApp
  • Viber
  • Telegram

Интерфейс в Unity выглядит так:

// vk, fb, ok, tw, wa, vb, tg
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class Sharing : MonoBehaviour {

	#if UNITY_IOS
		[DllImport ("__Internal")]
		private static extern void shareVia (string app, string message, string url, string param);
	#endif

	// Поделиться 
	public static void ShareVia (string app, string message, string param = "") {
		#if UNITY_ANDROID
			message = string.Format ("{0} {1}", message, "http://my.url.com"); // добавление ссылки
			using (var plugin = new AndroidJavaClass("com.mycompany.sharing.Plugin")) {
				plugin.CallStatic("shareVia", app, message);
			}
		#elif UNITY_IOS
			shareVia (app, message, "http://my.url.com", param);
		#endif
	}
		
	// Не удалось расшарить
	void OnShareError (string result) {
		switch (result) {
			case "NotInstall":
				// приложение не установлено
				break;
			case "NotAvailable":
				// шаринг не доступен
				break;
			case "AccessDenied":
				// нет доступа
				break;
			default:
				// не удалось расшарить текст
				break;
		}
	}
}

Например, чтобы расшарить в Facebook, достаточно вызвать:

Sharing.ShareVia ("fb", "Hi from Unity");

Для работы некоторых API, нужны ID приложений. Чтобы их получить, необходимо создать приложения для этих соц. сетей, как это сделать обычно написано в специальном разделе для разработчиков на сайте. Например, как для ВКонтакте.

Внутренности каждого плагина тут расписывать не буду, исходники все доступны, если будут вопросы пишите — почта внизу страницы.

Исходник на Github

 2 комментария    1193   2016   android   ios   plugin   unity

Добавление фреймворков в iOS проект

Как добавить сторонний фреймворк в iOS проект после билда Unity? При создании различных плагинов, это может быть актуально. К счастью для разработчиков, в Unity можно писать скрипты для пост обработки, а в 5 версии добавили встроенную поддержку работы с XCode проектом.

По ссылке пример, как можно добавить необходимые параметры в Info.plist, фреймворки и файлы в XCode проект.

 Нет комментариев    523   2016   ios   unity   ссылки

Оптимизация 2D игр на Unity

Этот пост будет периодически дополняться и обновляться.
Обновлено 13.10.2021

На Youtube куча уроков по созданию простейших 2D игр на Unity. Реально, сделать неплохой платформер можно за день, при наличии опыта и готовых ассетов. Но многие начинающие игроделы сделав проект и протестировать его на ПК, с ужасом наблюдают как их творение тормозит на мобильном устройстве.

В мануалах, что встречаются в сети, большинство советов собрано к версии Unity 4.6+, кроме того, они почти все на английском, что для некоторых является преградой. В этом посте, я постарался собрать те моменты, которые помогли мне избавится от лагов на iOS и Android. Но важно понимать — не все можно решить лишь настройками, очень важна и архитектура приложения, и подготовленные текстуры, и знание более оптимальных алгоритмов.

Что нужно предпринять, чтобы повысить производительность, поднять FPS, снизить CPU?

1. Кешируем все!

Все, что будет использоваться больше одного раза лучше закешировать. Операции типа GameObject.Find() или GetComponent() достаточно ресурсозатратны, а если они вызываются где-нибудь в цикле или в Update (), то производительность может упасть.

void Awake () {
	_cachedTransform = transform;
}
 
void Update () { 
	_cachedTransform.localPosition = _newPosition;		
}

Не используйте Resources.Load () каждый раз когда нужно в рантайме загрузить что либо, это тоже дорогая операция. Лучше при старте закешировать и работать с кешем. Ну и конечно, объединяйте в префабы.

2. Настройки графики

В Unity есть 6 стандартных пресетов настройки качества графики. Но так как мы говорим про оптимизацию для 2D и для мобильных устройств, то все что выше Simple нет смысла ставить. Конечно, если у вас есть какие-то специфические моменты, частицы, и т. д., то с параметры можно поэкспериментировать найдя оптимальный баланс.

3. Используем FrameRate

По-умолчанию FrameRate равен 30. И зачастую этого бывает достаточно. Но например, при создании UI где есть прокручивающие списки и движущие элементы, может появится дрожание или шлейф. Я это заметил при тестировании на iPhone, поэтому вручную повысил FrameRate. А понижая FrameRate на сценах или игровых меню, где ничего не двигается, можно значительно снизить CPU, а следовательно продлить жизнь батарее устройства. Пользователи не любят когда игра сжирает аккумулятор за час.

public int _frameRate = 60;

void Start () {
	#if UNITY_IOS
		QualitySettings.vSyncCount = 0;
	#endif
}

void Update () {
	#if UNITY_IOS
		if (_frameRate != Application.targetFrameRate)
			Application.targetFrameRate = _frameRate;
	#endif
}

4. Атлас текстур

Определенно, нужно упаковывать все свои спрайты в атласы. Для этого есть как встроенный инструмент Sprite Packer, так и продвинутый TexturePacker. Для работы встроенного упаковщика, достаточно задавать теги в настройках импорта, объединяя текстуры и спрайты по смыслу и месту использования.

Таким образом уменьшается количество вызовов отрисовок ваших спрайтов. Проверить как идет отрисовка можно с помощью встроенного инструмента Frame Debugger.

5. Используем пул объектов

GameObject.Instantiate () — очень дорогая операция! Если есть возможность не использовать ее в процессе игры — не используйте. Для большого количества однотипных объектов надо использовать пул объектов. Один раз инициализировав определенное количество, например пуль, они будут использоваться снова и снова, вместо создания и уничтожения каждый раз. Урок по пулу объектов и готовый шаблон, для начала будет достаточно.

6. Меньше Update — больше событий

Метод Update () вызывается каждый кадр, FixedUpdate () в некоторых случаях еще чаще. Если у вас в этих местах происходит много различных проверок и действий, это можно сказаться на производительности. Я использую событийную модель: вместо проверки условия в Update (), когда происходит какое-либо действие, отправляется событие, а в нужном месте это событие «слушается» и обрабатывается в зависимости от переданных параметров. Для этого можно использовать менеджер событий о котором я писал ранее.

7. Выключаем неиспользуемые компоненты

Деактивируйте объекты которые не попадают в камеру и которые не видно на сцене. Это также повысит производительность. Можно использовать вот такой хак, чтобы автоматически деактивировать объекты которые выходят за определенные границы.

8. Настройки билда

Билд под конкретную платформу, тоже можно оптимизировать. Например, если акселерометр не используется в игре, его лучше вообще отключить. Кроме того, я не использую автовыбор графического API, а задаю его сам убирая все остальные, опять же, если вы не используете какие-то специфические функции из OpenGLES 3.0, а так второй версии вполне хватает, она уже давно протестирована. Включаем статичный и динамический батчинг, а для Android многопоточный рендеринг. Для iOS включаем Script Call Optimization в Fast but no Exceptions, но тут момент — если будет какое-то исключение, то игра крашится.

9. Используем Profiler

Не стоит обделять вниманием профайлер. Обязательно протестируйте свою игру и посмотрите, в какие моменты идет максимальная нагрузка. Эти места нужно оптимизировать в первую очередь. Большинство ответов можно найти на stackoverflow.com или форуме Unity, просто загуглив название метода который тратит больше всего ресурсов.

10. Использование материала для UI Image и SpriteRenderer

Если у вас сложный интерфейс и много компонентов, особенно UI Image, то они существенно будут влиять на FPS. Чтобы повысить производительность, улучшить плавность анимаций, можно применить такой хак: там где вы не используете маски, у картинок нужно задать материал Sprites-Default. Если это сделать вместе с маской, то маска не сработает и получите примерно такой варнинг:

Material Sprites-Default doesn’t have _Stencil property

Чтобы убрать эту ошибку нужно немного изменить стандартный шейдер, сделать новый материал и применить его там где есть маска, тогда все сработает. Ссылка на измененный шейдер.
Цена плавности — повышение CPU :(

11. Уменьшаем размер текстур

Отличная утилита которая позволяет снизить потребления памяти для текстур до 3х раз. Как это работает и ссылка на Github, в статье на Хабре.

12. Практическое руководство по оптимизации Unity игр

Подойдет как для 2D, так и для 3D. Много полезной информации которую в документации вряд ли найдешь. Тут и про инструменты, и про опыт. Рассказывает специалист по эксплуатации из Unity Technologies — очень интересно. Узнал про memory profiler и то, что Camera.main не закеширована О_О. Обязательно смотреть всем.

13. Используем оптимизированный код

Снова хочется посоветовать набор оптимизированных скриптов от Leopotam. Коллекции, сериализация, векторы и многое другое. Настоятельное рекомендую, к изучению и использованию.

14. Используем одинаковые материалы

Если на объектах стоят разные материалы, они не будут батчится и будет больше вызовов отрисовки. Соответственно, нужно по возможности использовать как можно меньше разных шейдеров и материалов. Для понимания, как работает начальная оптимизация графики 2D, на Lynda.com есть небольшой курс.

15. Размеры атласов и спрайтов

Для применения сжатия спрайтов на мобильных устройствах нужно использовать атласы с размерами кратными степени 2, т. е. 1024х1024, 2048х2048.

16. Используйте UI Profiler

В Unity 2017 появился UI Profiler! Крутая штука, теперь можно выяснить почему в интерфейсе много вызовов отрисовки, увидеть какие материалы на объектах и всё это оптимизировать. Особенно актуально, если у вас сложные интерфейсы со множеством элементов, которые например, прокручиваются в ScrollRect.

17. Уголок оптимизатора

На сайте Unity появился специальный раздел посвященный оптимизации — Optimization corner. Там и про UI, и профайлеры, и основные ошибки, в общем, стоит ознакомиться.

18. Несколько советов по оптимизации UI

Раннее уже упоминали про Camera.main, но в новой статье описаны ещё несколько интересных особенностей оптимизации UI.

19. Сборник советов от FunCorp

Хорошая статья про оптимизацию UI. Многое уже описано тут, но есть и замечания по новым компонентам, например TextMeshPro.

20. Оптимизация UI без кода

Статья от Banzai Games про основные способы не делать неправильно Unity UI. Есть и интересные замечания. Зачем только снова про древний текстовый компоненты говорить... Думаю уже все перебрались на TMP.

21. Оптимизация мобильных 3D-проектов

Хорошая статья про оптимизацию в 3D. Многое подойдет и для 2D. Рассмотрены все аспекты и UI, и текстуры, шейдеры, батчинг и т. д.

22. Топ-10 ошибок в оптимизации Unity

Хороший вебинар от юнитеков, рассмотрены частые ошибки совершаемые при оптимизации, обзор инструментов по оптимизации, примеры с пояснениями.

23. Оптимизация игр на Unity: проверенный в деле план

Перевод отличной статьи по оптимизации игр на Unity. Как подготовиться к оптимизации, что лучше делать, что не делать, как правильно использовать профайле и многое другое.

Пока все. Тут не было про физику, потому что пока я ее не использовал. Возможно, в будущем добавлю. Пишите в комментариях ваши проверенные способы оптимизации для 2D игр под Unity.

Ранее Ctrl + ↓