- PVSM.RU - https://www.pvsm.ru -
Это вторая часть истории (вперемешку с рассказом о моих ошибках и их решениях) о том, как я (где-то два года в свободное время) разрабатывал мобильное приложение (под iOS/Android), которое бы мотивировало мою дочь решать примеры по математике. В итоге, получилось приложение, позволяющее ребёнку зарабатывать деньги своим умом.
Пример ниже показывает корутину светофора, которая бесконечно (каждые десять секунд) зажигает по очереди жёлтый, красный, зелёный свет:
IEnumerator TrafficLights()
{
while (true)
{
yield return new WaitForSeconds(10f);
yield StartCoroutine(this.GetComponent<Lamp>().BlinkYellow());
yield StartCoroutine(this.GetComponent<Lamp>().BlinkRed());
yield StartCoroutine(this.GetComponent<Lamp>().BlinkGreen());
}
}
Если человеческим языком, то инструкция yield как раз и говорит Unity, что нужно переносить выполнение функции в следующий кадр (столько раз, сколько потребуется) пока она не выполнится, а потом приступать к следующей yield инструкции. Т.о. корутина TrafficLights будет выполняться так:
Видео, которое мне помогло начать использовать GitHub [3] в связке с Unity — How to use GitHub with Unity [4].
Несмотря на то, что я сам (в одиночку, без команды) пишу код, я понял, что контроль версий кода мне просто жизненно необходим:
Вот только при работе с контролем версий нужно приучить себя комитить (постить обновления) очень маленькими порциями. Чтобы не было как у меня поначалу — изменил 20 файлов, добавил тонну нового функционала и закомитил всё это за один раз под названием «Фух, теперь оно наконец-то работает».
Хорошо, что я когда-то разобрался, что лучше не добавлять в репозиторий файлы кеша (папка Library), временные файлы (папка tmp, obj), и всё что Unity генерит на лету. По сути, в репозиторий нужно было добавлять только папки Assets и ProjectSettings.
Не обязательно использовать GitHub, ведь его минус в том, что в бесплатном аккаунте нельзя сделать код приватным (видимым только для себя). Но зато есть GitLab [5] или Bitbucket [6], где это возможно.
Я воспринимаю своё приложение, как обучающее и стараюсь, по возможности, не использовать отвлекающие моменты. Поэтому, иногда пользователи жалуются, к примеру, на отсутствие музыки или сильно простецкий интерфейс (хотя простецкий интерфейс — это не потому, что я так захотел, а больше потому, что пока лучше не умею). С музыкой я немного на распутье сейчас: и хочется добавить и колется (вряд ли учителя одобрили бы решение домашки по математике под музыку).
Музыка, музыкой, но без озвучки нельзя. Сначала я искал нужные мне звуки среди бесплатно распространяемых, но потом понял, что на поиск уходит больше времени, чем если бы я их делал самостоятельно. Поэтому большинство звуков я просто насоздавал ртом в телефонный микрофон, а потом обработал с помощью Audacity [7] (бесплатная многоплатформенная софтина для записи и редактирования аудио, которую я использовал раньше для конвертирования звука из одного формата в другой).
Чаще всего логика создания звукового эффекта в Audacity была следующей:
Поначалу, у меня сильно заметно отставал звук от события (не в редакторе, а на смартфоне). Помогла опция DSP Buffer Size выставленная в режим Best latency (Edit -> Project Settings -> Audio) и вот эти советы [8] (как в вопросе, так и в ответе).
Пока я разрабатывал приложение, то пробовал несколько раз создавать иконки самостоятельно, но ни одна из них не прижилась (да и по правде говоря, выходила какая-то муть). Поэтому, когда дело дошло до открытой публикации, я поручил разработку иконку дочери. Объяснил ей, что иконка должна быть привлекательной и объяснять смысл приложения. Она подошла с большим энтузиазмом и моментально нарисовала совершенно непригодную картинку. Я её забраковал и объяснил, что именно нужно улучшить или не использовать вовсе. Дальше всё пошло, как и ожидалось — она обиделась и перестала рисовать иконки.
Спустя полмесяца, обида прошла и она подошла к заданию более основательно: нарезала из тетради в клеточку квадратиков (по размеру как иконка на экране её iPod-а) и начала рисовать варианты один за другим:
Приносила мне. Я выбирал понравившиеся мне идеи. Говорил, в каком направлении двигаться дальше. Она уходила рисовать следующие варианты. Спустя два дня и три десятка вариантов мы остановились на правом нижнем (фото выше).
Дальше я попросил дочь нарисовать увеличенную версию иконки (первая слева на рис. ниже), которую я перевёл в цифровую форму (вторая слева) и… позвонил знакомому художнику, чтобы он помог мне с подбором цвета. В итоге был получен центральный вариант. Дальше я стал постепенно шлифовать иконку (вторая справа) на протяжении всей жизни приложения в магазинах. И сейчас она выглядит как крайняя правая:
С созданием моего первого APK-файла мне помогло разобраться вот это видео Unity Android Build — How to [9], где рассказывается как всё настроить, не устанавливая тяжеленную Android Studio.
Повторюсь, что у меня нет устройств с Android-ом (я просто прошу друзей потестить после новой сборки) и поэтому ошибки с устройствами, что показаны на видео — у меня отсутствовали.
Но без задоринки всё равно не обошлось. Пришлось долго повозиться с обновлением Android SDK, поскольку Unity не хотела работать с самыми последними обновлениями. В итоге, оказалось, что нужно было дать возможность Unity самому выбирать и устанавливать нужную версию обновления. Т.е. я просто нажал кнопку Update Android SDK в самом Unity, а не пытался обновить всё самостоятельно, как это показано в видео.
Пока я не догадался, что нужно обновляться из-под Unity, я долго страдал, обновляясь вручную с помощью скрипта sdkmanager.bat (нужно использовать именно этот скрипт с параметром --update, а не android.bat, который указан в видео). Он во время обновления жаловался, что не может перезаписать папку tools (из которой же сам и запускался). Пробовал кучу советов и уже даже не помню, что помогло, кажись какое-то решение с symboliс links.
Ещё у меня выскакивали непонятные ошибки, связанные с java. Оказалось, что проблема с версией Java Development Kit — его также не нужно было устанавливать самую последнюю версию. Я попробовал несколько старых и на одной из них ошибки пропали и всё заработало.
С подписью apk-ашки для публикации в Google Play мне помогло видео How to sign a Unity app for the android market [10]. Я хорошенько сохранил и забекапил эти два пароля, поскольку их нужно вводить каждый раз при создании нового билда. А если их потерять, то нельзя будет обновить приложение (только выпустить новое с новыми ключами).
Иконку, в отличии от iOS версии, нужно изначально делать со скруглёнными углами, иначе на некоторых устройствах, она так и останется идеально квадратной.
Сейчас размер моего apk-файла 22МБ.
Я хорошо уменьшил размер сборки с помощью формата сжатия текстур/спрайтов с потерями — RGBA Crunched ETC2 (для спрайтов с альфой) и RGB Crunched ETC (для текстур без альфа-канала). Главное, нужно было выставить Compressor Quality = 100 (этот параметр не влияет на быстродействие текстур на конечном устройстве, а только на качество текстуры и на скорость сжатия в редакторе).
Любые другие танцы с бубнами не позволили мне добиться какого-либо существенного уменьшения размера apk-файла (кроме некоторых нюансов, описанных ниже).
Сейчас я использую следующие..
.. для минимального размера с одной стороны и максимального покрытия устройств с другой:
Собираю я приложение на макбуке жены (помню, брали самый дешёвый MacBook Air 2015-го года).
Чтобы собирать под iOS 7 даже в XCode версии 9.3 оказалось достаточно вручную вбить значение 7.0 в поле Deployment Target (на закладке General).
Чтобы добавить языки (на которые я перевёл приложение с помощью Lean Localization) в описание приложения в AppStore, нужно было добавить следующие строчки в файл info.plist (в любое место, к примеру, сразу после <dict>):
<key>CFBundleLocalizations</key>
<array>
<string>English</string>
<string>Russian</string>
</array>
Сейчас я использую Unity 2017.4 для сборки под iOS (как я писал выше, мне нужна поддержка iOS 7, иначе я бы использовал 2018.1).
Сейчас размер закачиваемого файла под мой айфон — 44 МБ.
К сожалению, под iOS я не могу использовать Crunched спрайты, поскольку они не поддерживаются на девайсах старее iPhone 5s (без поддержки Metal и OpenGL ES 3.0 [11]).
Когда я пробовал уменьшить размер билда любой ценой, то самый маленький размер (34 МБ) получался если:
Но я ещё совсем не разобрался, как работать с app thinning [12] — это такая штука, которая позволяет апстору автоматически собирать моё приложение под конкретный iPhone/iPad/iPod конечного пользователя (что приводит к уменьшению размера скачиваемого файла). Я только успел статей в закладки себе набросать:
Сколько пользовался Booking-ом и TripAdvisor-ом, но никогда не замечал, что их название в AppStore не просто Booking, а «Booking.com Travel Deals» и «TripAdvisor Hotels Restaurants» (название разбавлено ключевыми словами, чтобы по этим ключевым словам приложение находили в поиске апстора). Поэтому я решил не использовать старое название Math4Ami, а долго игрался с разной формулировкой, чтобы включить туда нужные мне ключевые слова. В итоге, сначала я пришёл к «Pocket Money: Math», а позже к «Learn Math & Earn Pocket Money». На русском эти варианты звучали как «Карманные деньги за математику» и «Карманные деньги и математика: учись и зарабатывай».
Продвигал я своё приложение рассылая/публикуя ссылки на него друзьям и знакомым, написал две статьи у себя на блоге и там же повесил баннер.
Кстати, если поместить в <head> web-страницы вот такую строчку:
<meta name="apple-itunes-app" content="app-id=1372434662" />
.. то, открывая эту страницу на iPhone, все будут видеть вверху баннер вашего приложения.
Сперва я выпустил iOS версию.
Очень многие говорили о нелюбви к яблочным девайсам и убеждали, что Андроид куда круче. Я решил проверить и, спустя 20 дней разбирательств со сборкой apk-файла, сделал релиз в Google Play.
Объективные выводы тут не сделаешь (или вообще никакие), но чисто субъективно — я ожидал большего от Google платформы, но она, на данный момент, оказалась в половину хуже Apple.
Список ссылок из статьи в очерёдности их упоминания:
+ Как держать единый стиль кода C# Style Guide with Unity in mind [2].
+ GitHub [3] и видео о том, как прикрутить git к Unity [4].
+ Бесплатный приватный репозиторий есть на GitLab [5] или Bitbucket [6].
+ Бесплатная Audacity [7] для записи и редактирования аудио.
+ Как убрать задержку звука [8].
+ Видеоурок Unity Android Build — How to [9].
+ Видео How to sign a Unity app for the android market [10].
+ Устройства Apple, поддерживающие Metal/OpenGL ES 3 [11].
+ App thinning [12] (Apple documentation).
+ App thinning [13] (Unity help).
+ AssetBundle Workflow [14] (Unity documentation).
+ Где брать Team ID [15].
+ Что такое запахи кода [16].
+ Принцип именования ассетов/ресурсов в игровых проектах на UE4 [17].
Спасибо, что дочитали!
Автор: yuriki
Источник [18]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-2/283689
Ссылки в тексте:
[1] Первую часть читайте тут: https://habr.com/post/414611/
[2] C# Style Guide with Unity in mind: https://github.com/raywenderlich/c-sharp-style-guide
[3] GitHub: https://github.com/
[4] How to use GitHub with Unity: https://youtu.be/qpXxcvS-g3g
[5] GitLab: https://about.gitlab.com/
[6] Bitbucket: https://bitbucket.org/
[7] Audacity: https://sourceforge.net/projects/audacity/
[8] вот эти советы: https://answers.unity.com/questions/640446/ios-audio-lag.html
[9] Unity Android Build — How to: https://www.youtube.com/watch?v=qjYMHdhJSiE
[10] How to sign a Unity app for the android market: https://www.youtube.com/watch?v=av5ANVlkU3g
[11] без поддержки Metal и OpenGL ES 3.0: https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/HardwareGPUInformation/HardwareGPUInformation.html#//apple_ref/doc/uid/TP40013599-CH106-SW1
[12] app thinning: https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f
[13] App thinning: https://docs.unity3d.com/Manual/AppThinning.html
[14] AssetBundle Workflow: https://docs.unity3d.com/Manual/AssetBundles-Workflow.html
[15] Account > Membership: https://developer.apple.com/account/#/membership/
[16] запахи кода: https://refactoring.guru/ru/refactoring/smells
[17] хороший пример для подражания для UE4: https://github.com/Allar/ue4-style-guide/blob/master/README.md
[18] Источник: https://habr.com/post/414683/?utm_campaign=414683
Нажмите здесь для печати.