Добавить в корзинуПозвонить
Найти в Дзене
Немного обо всем

Запаковывание проекта UE4 под Android

Разработка игр довольно увлекательный процесс и при должном интересе любой человек сможет освоить какой-либо игровой движок для дальнейшего создания на нем своих игр. Помимо обычных PC игр существует и множество Мобильных игр, которые так же разрабатываются на игровых движках. В этой статье я расскажу вам как правильно запаковывать созданный проект на движке Unreal Engine 4 под Android, как оптимизировать его, как снизить вес, как охватить большое количество поддерживаемых устройств и т.д.
Поехали! Стоит отметить, что эта статья основывается на работе UE4 с версией 4.25.3. Если же вы используете движок более старшей версии, то рекомендую переехать на последнюю версию (или же на 4.25+, чтобы охватить все возможности). 1. Создание проекта На этапе создания проекта движок генерирует стандартные настройки, которые сильно влияют на производительность. Шаблон проекта Шаблон проекта почти никак не сказывается на производительности. Но! Рекомендую использовать пустой шаблон (blank), чтобы в
Оглавление

Разработка игр довольно увлекательный процесс и при должном интересе любой человек сможет освоить какой-либо игровой движок для дальнейшего создания на нем своих игр. Помимо обычных PC игр существует и множество Мобильных игр, которые так же разрабатываются на игровых движках. В этой статье я расскажу вам как правильно запаковывать созданный проект на движке Unreal Engine 4 под Android, как оптимизировать его, как снизить вес, как охватить большое количество поддерживаемых устройств и т.д.

Поехали!

Стоит отметить, что эта статья основывается на работе UE4 с версией 4.25.3. Если же вы используете движок более старшей версии, то рекомендую переехать на последнюю версию (или же на 4.25+, чтобы охватить все возможности).
Unreal Engine 4 + Android
Unreal Engine 4 + Android

1. Создание проекта

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

Шаблон проекта

Шаблон проекта почти никак не сказывается на производительности. Но! Рекомендую использовать пустой шаблон (blank), чтобы в будущем не столкнуться с лишним мусором, на удаление которого придется потратить время.

Настройки проекта

  • Выбор языка. Создавайте проект на С++. Это дает много плюсов, начиная от доступа к коду С++ и заканчивая более быстрой работой. Blueprints во много раз работают медленнее кода на С++ и во время загрузки подгружают все, что используют. Стоит отметить, что создавать логику вы так же сможете на Blueprints.
  • Параметры качества. Максимальное качество съедает много ресурсов устройства, поэтому выбираем Масштабируемость.
  • RTX. Большинство видеокарт ПК не поддерживают RTX. Про мобильные девайсы можно даже не говорить.
  • Платформа. Так как мы создаем проект под Android, то указываем Мобильную платформу. Это позволит движку настроить проект под мобильные устройства.
  • Стартовый контент. Рекомендую не использовать стартовый контент, так как в нем мало чего можно найти полезного. По крайней мере вы можете упустить/перепутать часть контента, который попадет в конечный билд и будет использовать ресурсы. Нам этого не нужно, поэтому ставим без стартового контента.
Настройки проекта во время его создания
Настройки проекта во время его создания

2. Настройка проекта под платформу Android

Перейдите в настройки проекта Project Settings и в разделе Platforms выберите пункт Android.

На этой странице находятся все основные настройки, связанные с Android, на которой нужно будет сконфигурировать файл манифеста. На данный момент нас интересует 2 кнопки Configure Now, которые находятся в красной рамке.

После того, как нажмем на эти кнопки, внутри проекта сгенерируется специальный файл, который хранит в себе указанные настройки. Помимо этого если генерация выполнилась успешно, то красная рамка сменит цвет на зеленую и нам станут доступны все параметры.

Перейдем теперь к более детальным настройкам на этой странице.
По каждому пункту проходиться не будем, так как многие из них нам не интересны и значимый функционал за собой не несут.

Главные настройки

Главные параметры проекта
Главные параметры проекта
  • Android Package Name. Важный параметр, который нужно заполнить внимательно. В этот параметр вписывается строка, состоящая из трех пунктов, которые разделяют обычные точки. Структура такова Com - Название компании - Название игры. Меняем только Название компании и Название игры, не удаляйте слово com и разделяющие точки. Пример: com.Valve.Portal
    P.S.
    Google Play использует этот параметр для генерации страницы приложения. После того, как зальете первый билд, Google Play сразу же зарезервирует ссылку с указанным параметром. Так что будьте внимательными при заполнении этого параметра.
  • Store Version. Довольно бесполезный параметр и в то же время очень важный. А важен он тем, что подписывает каждый билд своим номером. Сделали обновление - прибавили +1 к предыдущему числу и можете спокойно генерировать билд игры. Стоит отметить, что Google Play очень придирчив к этому параметру и не принимает новые билды (там это называется Объектом) с тем же номером. Так что советую не забывать перед созданием билда прибавлять +1.
    Лично у меня часто бывает такое. Сделаю какое-нибудь обновление, скомпилирую игру, залью обновленную версию игры и получаю ошибку от Google Play, потому что Объект с таким номером уже присутствует в этом проекте, из-за чего приходилось заново открывать движок, менять номер версии и снова компилировать игру.
  • Application Display Name. Параметр, который отвечает за название игры, указанное на рабочем столе устройства.
  • Minimum SDK Version. Этот параметр отвечает за минимальный уровень API приложения, то есть минимальной версии Android устройства. На разных версиях движка указывается разная цифра. Так как мы используем современные девайсы и современный движок, то здесь нужно указать цифру 19 (Минимальная версия Android будет 5).
  • Target SDK Version. Этот параметр уже отвечает за целевой уровень API приложения. Здесь указываем цифру 29. API с уровнем 29 дает расширенный каталог устройств на Android (более 12000 устройств).

Остальные параметры в этом пункте являются необязательными и настраиваются индивидуально под каждый проект при необходимости.

Настройки генерируемых файлов

Настройки генерируемого AAB файла с проектом
Настройки генерируемого AAB файла с проектом

Android устройства принимают приложения с расширением APK. С недавнего времени Google Play ввела возможность разработчикам генерировать вместо APK файла AAB файлы (Android App Bundle). Такая технология упрощает жизнь разработчикам тем, что сохраняет им время. Google Play из AAB файла сам генерирует и оптимизирует под устройства APK файлы, причем кэш файлы приложения сразу же вшиваются и нам не нужно генерировать дополнительные OOB файлы. В общем говоря, нужно просто сделать AAB файл, залить его в Google Play, после чего он сделает за нас часть кропотливой работы. Так как эта технология новая, в Unreal Engine 4 она внедрена только в версии 4.25 и выше.

  • Generate bundle (AAB). Собственно этот параметр отвечает за генерацию файла с расширением AAB.
  • Generated universal APK from bundle. Этот параметр отвечает как раз таки за генерацию уже оптимизированного и универсального APK файла, но если включить его, то время генерации билда немного увеличится. И все же этот параметр я оставил включенным, так как после генерации билда его сразу же можно по проводу установить на Android устройство, чтобы протестировать обновление. Если же вы экономите ресурсы и не планируете перед публикацией тестировать билд игры, то галку можно снять.
  • Enable ABI split. Если галка стоит, то в один AAB файл добавляются билды игры для разных архитектур процессоров. Если нет - генерируются разные AAB файлы.

Два остальные параметра нам важности никакой не несут, поэтому их можно пропустить.

Настройка под разные архитектуры

Настройки генерируемого AAB файла под разные архитектуры
Настройки генерируемого AAB файла под разные архитектуры

Небольшие, но довольно важные параметры, которые отвечают за тип архитектуры билда. Нам нужно поставить галки на против трех параметров: Support armv7 [aka armeabi-v7a], Support armv64 [aka arm64-v8a] и OpenGL ES3.1. Кратко расскажу почему. С недавнего времени Google Play стал поддерживать только х64 приложения, собственно вышеуказанные параметры поддерживают эту архитектуру. Vulkan пока лучше не ставить, так как он использует много ресурсов для обработки данных.

В разделе Advanced Build параметры можно не трогать, так как они дополнительно генерируют наборы символов для дальнейшей оптимизации APK файлов в Google Play. Генерируемый набор символов весит более 300 мб, Google Play же принимает файлы с набором символов весом не более 210 мб. Так что этот раздел мы пока не затрагиваем.

Вспомогательные настройки

Скриншот, на котором показаны необязательные разделы
Скриншот, на котором показаны необязательные разделы

Разделы Advanced APK Packaging и Project SDK Override пропускаем, нам они сейчас особо не интересны. В паре слов - Advanced APK Packaging отвечает за добавление разрешений в манифест для приложения, например, добавление покупки внутриигровых предметов и тд; Project SDK Override отвечает за отключение глобальных настроек указанных параметров от движка и использование своих параметров в этом проекте. В общем говоря, нам это не нужно, это так же все настраивается индивидуально для каждого проекта.

Генерация ключа KeyStore

Раздел с добавлением KeyStore
Раздел с добавлением KeyStore

Очень важный раздел, без которого вы не сможете сделать билд приложения и сгенерировать сертификат в Google Play. Более подробно о генерации ключа расписано в Этой статье. Я же вам покажу 2 способа как правильно создать ключ.

Первый способ можно образно разбить на 2 пункта - Везунчики и Невезунчики. Предварительно у вас на ПК должна быть установлена Java.

Начнем с Везунчиков
Откройте
CMD от имени администратора и впишите команду keytool -genkeypair -alias upload -keyalg RSA -keysize 2048 -validity 9125 -keystore keystore.jks, в которой upload является названием вашего Alias ключа и keystore.jks вашего KeyStore ключа, причем расширение .jks обязательное. Если вам не выдало никаких ошибок и консоль просит ввести пароль, то вы Везунчик. Если после введения команды вам выдало ошибку "keytool" не является внутренней или внешней командой, исполняемой программой или пакетным файлом, то можете сразу переходить к пункту для Невезунчиков.

Генерация KeyStore ключа с помощью CMD
Генерация KeyStore ключа с помощью CMD

После введения указанной команды консоль предложит нам ввести пароль. Этот пароль является паролем генерируемого Keystore.jks. После повторного введения пароля вам нужно будет ввести настоящие данные о себе: Имя и Фамилия, Название подразделения вашей организации, Название вашей организации, Название вашего города, Название вашей области, 2 кодовые буквы страны (RU, UA, BY и тд). Далее нужно подтвердить правильность введенных данных с помощью слова yes, после чего нужно 2 раза ввести пароль для вашего Alias ключа. После этого ключ будет сгенерирован на диске С в папке с вашим профилем. Перейдите в указанную папку, скопируйте сгенерированный файл и перенесите его в папку с вашим проектом по этому пути НазваниеПроекта\Build\Android\. После этого в настройках проекта в разделе Distribution Signing в параметре Key Store указываем название ключа вместе с расширением. В Key Alias указываем название Alias ключа. В Key Store Password вводим пароль от KeyStore. В Key Password указываем пароль от Alias ключа.

Перейдем к Невезунчикам.

В случае, если вам выдало ошибку - не расстраиваемся. Можно перейти к 100%, но более длинному (по времени) способу под номером 2 или же сделать опять же все через консоль, прибегнув немного к другому способу. Способ Невезунчиков можно опять же разбить на 2 подспособа.

  1. На диске С найдите папку с Java, далее перейдите в папку под названием jreX.X.X_XXX (вместо X будут цифры, которые указывают на версию вашей Java. Они не принципиальны) и в этой папке перейдите в bin. Скопируйте путь (у меня получился такой C:\Program Files (x86)\Java\jre1.8.0_251\bin). Откройте CMD от имени администратора. Введите команду CD + ваш путь (В моем случае CD C:\Program Files (x86)\Java\jre1.8.0_251\bin). С помощью этой команды мы укажем системе в какой папке использовать указанную команду. После того, как вы перевели систему на папку bin можете переходить к способу Везунчиков и генерировать свой KeyStore файл.
  2. Если же вы опять получили ошибку по типу Отказано в доступе или другую, то перейдем к другому варианту генерации. Нам нужна программа под названием NVIDIA CodeWorks for Android. Раньше лаунчер программы был вшит в движок. В версии 4.25+ его убрали. Если вы используете движок ниже 4.25 версии, то перейдите в папку с движком по этому пути UE_4.24\Engine\Extras\AndroidWorks\Win64\, запустите программу CodeWorksforAndroid-1R7u1-windows.exe и установите Java SDK. Если у вас нет лаунчера по указанному пути, то его можно скачать с Официального сайта nVidia. Теперь, когда вы скачали лаунчер и через него установили Java SDK, вам нужно перейти к первому пункту у способа для Невезунчиков, выполнить все указанные там пункты, но только теперь нужно указать путь не до самой Java, а до только что установленного Java SDK (В моем случае это D:\NVPACK\jdk1.8.0_77\bin). Теперь ключ должен сгенерироваться без проблем.
    P.S. Если у вас NVPACK установлен не на диске С, то команда CD может не перебросить вас по указанному пути. Для этого нужно после команды CD указать через слэш сам диск, а после этого прописывать путь (В моем случае это CD /D D:\NVPACK\jdk1.8.0_77\bin).
    P.S.S. Можно обойтись без установки лаунчера. Достаточно найти в интернете другие версии jre, скачать и разархивировать ее в удобную для вас папку.

Второй способ является самым простым, но достаточно длительным. Для этого нам необходимо установить Android Studio с официального сайта.

После установки Android Studio нужно создать пустой проект, который понадобится только для генерации KeyStore, после чего созданный проект и сам Android Studio можно будет удалить. В созданном проекте в верхней панели нужно выбрать Build и в выпадающем меню Generate Signed Bundle / APK.... Откроется окно, в котором нужно выбрать пункт Android App Bundle. Далее откроется окно с информацией о ключе, здесь нужно нажать Create new... для создания ключа. Откроется окно для заполнения информации о владельце ключа. В Key store path указываем название ключа с расширением .jks, в Alias придумываем название для вашего Alias ключа. После заполнения информации о ключе нужно указать путь, где будет сгенерирован сам ключ. В варианте генерации указываем тип release. Все, ключ успешно сгенерирован. Перейдите в указанную папку, скопируйте сгенерированный файл и перенесите его в папку с вашим проектом по этому пути НазваниеПроекта\Build\Android\. После этого в настройках проекта в разделе Distribution Signing в параметре Key Store указываем название ключа вместе с расширением. В Key Alias указываем название Alias ключа. В Key Store Password вводим пароль от KeyStore. В Key Password указываем пароль от Alias ключа.

Настройки сервиса Google Play

Раздел с сервисами Google Play
Раздел с сервисами Google Play

Один из важных разделов, в котором помимо данных приложения можно подключить второстепенные сервисы Google Play по типу Рекламы, Достижений, Лидербордов и тд. Указывать данные тут пока не обязательно, так как билд игры может сгенерироваться пока без них, но если вы собираетесь выпускать игру в Google Play, то здесь нужно указать данные в следующих параметрах:

  • Enable Google Play Support. Параметр активирует Google Play систему и все, что с ней связано.
  • Games App ID. В этом параметре нужно указать ID приложения в Google Play.
  • Google Play License Key. Параметр, в который вводится лицензионный ключ для приложения, который сгенерирует Google Play.

Остальные параметры используются для подключения сервисов Google Play, который не обязательно использовать в приложении.


3. Настройка вспомогательных файлов для генерации билда

Теперь необходимо добавить в настройки проекта пути к вспомогательным файлам, благодаря которым движок будет генерировать билд приложения.

Раздел Platforms, в котором нужно выбрать пункт Android SDK
Раздел Platforms, в котором нужно выбрать пункт Android SDK

Нужно перейти в Project Settings. В разделе Platforms теперь выбираем пункт Android SDK. Параметров тут не так много, поэтому времени это много не займет. Нам лишь нужно скачать Android SDK Windows, Android NDK версии не ниже r21d (Если используете движок с версией ниже 4.25, вам нужно будет NDK более поздней версии) и JDK. Скачать эти файлы можно с помощью лаунчера NVIDIA CodeWorks for Android. Как установить с помощью лаунчера написано выше в пункте Генерация ключа KeyStore. Эти файлы так же можно скачать без лаунчера через интернет.

Ссылки на официальные сайты с указанными файлами.

Параметры раздела Android SDK
Параметры раздела Android SDK

После установки необходимых файлов в каждом параметре нужно указать пути до установленных папок.

  • Location of Android SDK. Указываем путь до папки \android-sdk-windows\.
  • Location of Android NDK. Указываем путь до папки \android-ndk-r21d\.
  • Location of JAVA. Указываем путь до папки \jdk.1.8.0_77\.
  • SDK API Level. Указываем целевой уровень SDK 21.
  • NDK API Level. Указываем параметр с последним целевым уровнем с помощью слова latest.

P.S. Напоминаю, что в пути NDK и jdk цифры могут различаться.

4. Оптимизация проекта

Теперь, когда проект настроен и игра готова, нужно оптимизировать ее подготовить к выпуску.

Путь до параметра Shipping
Путь до параметра Shipping

Изначально нужно указать, что билд игры будет не для разработчиков, а для публичного использования. Для этого в верхнем правом углу движка жмем на File, в выпадающем меню на Package Project, откроется еще одно меню, в котором нужно выбрать Build Configuration и в нем уже ставим параметр Shipping.

Параметр для указания стартовой карты
Параметр для указания стартовой карты

Теперь нужно указать движку стартовую карту, которая будет открывать при запуске игры. Переходим в Project Settings и в разделе Project выбираем пункт Maps & Modes. В открывшемся разделе в параметре Game Default Map ставим карту, которую нужно запускать при старте игры.

Универсальные способы оптимизации проекта

Когда стартовая карта указана, можно переходить к настройкам сборки билда. Перейдите в раздел Packaging. В нем будет еще один раздел Packaging. Стрелочка вниз раскроет больше параметров этого раздела. Нажмите на нее пролистайте чуть ниже. Здесь нам нужно поставить галочки на против следующих параметров.

  • Create compressed cooked packages. Сжимает все ассеты проекта, значительно снижая вес билда.
  • Exclude editor content when cooking. Параметр, который не включает в сборку файлы движка, которые не используются.
  • Exclude movie files when staging. Параметр, который тоже не включает в сборку видео файлы движка.

В этом разделе есть еще один полезный пункт List of maps to include in a packaged build. Он представляет из себя массив данных, в который можно загрузить пути карт, которые нужно добавить в билд игр.

Перейдем к разделу Project.

  • Build Configuration. Если после первых настроек не выставился параметр Shipping, выставляем его вручную.
  • Standing Directory. В этом параметре указываем путь, куда будет сохраняться файлы билда приложения.
  • Full Rebuild. Параметр отвечает за полную пересборку проекта во время генерации билда. Склоняюсь к тому, что параметр нужно включить, но если вы делаете ребилд проекта перед генерацией билда, то параметр можно не включать.
  • For Distribution. Параметр позволяет распространять билд игры в магазинах (Google Play). Его нужно обязательно включить.

Остальные параметры нас не интересуют, поэтому двигаемся дальше.

Переходим к разделу Blueprints.

Тут 1 нужный параметр - Blueprint Nativization Method. Включаем ему параметр Inclusive. Этот параметр оптимизирует всю логику во всех Blueprint.

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

  • Текстуры. Не используйте высококачественные текстуры. Мобильные девайсы на данный момент не совсем мощные и нужно экономить ресурсы. Поэтому текстур с разрешением 256х256 будет вполне достаточно.
  • Материалы. Старайтесь использовать в материалах параметр Shading Model со значением Until.
  • Blueprints. Не используйте Level Blueprint для написания логики, это съедает много ресурсов. Старайтесь как можно меньше использовать касты, если они используются, то лучше завести отдельную переменную для них. Используйте меньше логики на Event Ticks.
  • Карта. Чем больше карта и чем больше на ней ассетов, тем больше ресурсов потребляется. Есть возможность - минимизируйте это, уменьшив карту и убрав лишние ассеты. Это так же касается объектов типа Foliage. Приветствуется повторное использование одних и тех же ассетов, этот способ потребляет гораздо меньше ресурсов.
  • Actors. Старайтесь меньше использовать Actor Blueprint, в которых имеется имеется логика (Боты и т.д.)
  • Меши. Используйте меши, у которых малое количество полигонов. Чем меньше полигонов и модели, тем меньше ресурсов на ее обработку потребляется.
  • Анимации. Тут так же, как и с Мешами. Меньше - лучше / менее качественная - лучше.
  • Исправление ссылок. В контент браузере движка кликните по файлу/папке правой кнопкой мыши и нажмите на параметр Fix up Redirectors in Folder. Этот параметр обновит указатели и исправит указатели на неиспользуемые объекты.
  • Мигрирование контента. Unreal Engine 4 хоть и является передовым игровым движком, но без багов не обходится. Бывает, что файлы, которые не используются в проекте, попадают в финальный билд приложения. Чтобы этого избежать, рекомендуется создать дупликат проекта. В первом проекте нужно нажать правой кнопкой мыши в контент браузере движка на главную карту, далее выбрать Migrate..., движок выделит только те ассеты, которые используются игрой, и после этого нужно выбрать папку Content в проекте дубликате для переноса файлов туда. После проделанных манипуляций в проекте дубликате будут находится только те файлы, которые использует игра.
  • Освещение. Если вы не используете освещение, отключите не нужные параметры в Project Settings -> Rendering (раздел Engine). Старайтесь меньше использовать Point Lights.
  • Плагины. Отключите плагины, которые не используете Settings -> Plugins.
  • 2D игры. Если ваша игра выполнена в 2D формате, то переведите все камеры в 2D. Выберите камеру и в разделе Camera Settings в параметре Projection Mode поставьте параметр Orthographic. Так же рекомендуется все спрайты объединить в один файл для более быстрого доступа к ним.

5. Запаковывание

Теперь, когда проект создан, правильно настроен и оптимизирован, можно сделать билд игры.

Создание первого билда
Создание первого билда

Для создания билда открываем пункт File в верхнем левом углу. Открываем меню Package Project. В выпадающем меню выбираем Android и в нем нужно выбрать Android (ETC2). Это универсальный тип сжатия, захватывающий большинство устройств. После этого выбираете папку, в которой разместится билд игры и ждем генерации файлов игры. Profit!

Заключение

В этой статье я постарался более понятным языком рассказать как настроить проект для создания билда под Android. Так же были озвучены универсальные способы для оптимизации проекта. В любом случае, каждый проект оптимизируется индивидуально - что-то подходит, а что-то нет, так что тут нужно исходить из многих критериев, чтобы подобрать правильный метод оптимизации. Если статья была полезна для вас, поделитесь ею со своими друзьями и поддержите актив. В следующей статье расскажу как опубликовать свою игру в Google Play. Чем выше активность, тем быстрее выйдет следующая статья :)