- Портирование UE4.23 игры на Android
- Бредисловие
- Подготовка окружения
- Подготовка проекта игры
- Project Settings…
- Изменения в коде и ассетах
- Разработка приложений на Unreal Engine 4
- Шаг 1. Установка Unreal Engine
- Шаг 2. Установка NVIDIA CodeWorks for Android
- Шаг 3. Создание нового проекта
- Шаг 4. Настройка проекта
- Шаг 5. Сборка и запуск проекта
- Разработка приложений на Unreal Engine 4 : 6 комментариев
Портирование UE4.23 игры на Android
Хочу поделиться опытом портирования нашей игры The Unexpected Quest на Андроид. В качестве движка использовали Unreal Engine 4. Родная версия 4.23, об особенностях портирования игры на этой версии и пойдет разговор ниже.
Картинка для привлечения внимания
Бредисловие
Хочу сразу отметить, что при разработке игры мы вообще не ориентировались на мобильную аудиторию. Поэтому никаких KPI, MAU, ARPU, RGB, LGBT и прочего не будет. Игра вышла в Steam, Nintendo Switch и казуальных порталах. Вот это наша аудитория и по другому мы пока продавать не умеем.
Почему решили выпустить? А потому что можем: аккаунт разработчика есть (тестировали как-то Unity), анрил с андроидом дружит, ну и пощупать что-нибудь новенькое хотелось. Независимо от результатов продаж, я все равно в выигрыше: буду знать тонкости работы с этой мобильной платформой.
Портирование я начал 4 апреля, а закончил 16 июня. Итого два с половиной месяца ненапряжной работы. В этот момент в приоритете был новый DLC, поэтому срок можно смело сократить до 2-х месяцев. А еще очень много времени заняло оформление странички: подготовка скриншотов, тексты и иконки.
В качестве основы использовалась версия движка 4.23. Это не самый лучший вариант, чтобы избежать множества проблем нужно использовать самую свежую версию движка. Но, у меня была «уважительная причина»: все новые версии выдавали на моем телефоне Redmi 5 Plus на 10 fps меньше. И хотя на планшете Galaxy Tab A все было нормально, я решил не рисковать. Попытки с наскока разобраться с этой ситуацией не увенчались успехом, а тратить время и зарываться в нее с головой не хотелось.
Подготовка окружения
Операционная система Windows 10. В качестве IDE использовалась Visual Studio 2019 (на момент финального билда игры версии 16.10.2). Как написал выше, движок Unreal Engine 4, версия 4.23. Установлен через лаунчер (т.е. я не собирал движок из сырцов), все галочки сняты, кроме Engine Source и Android. А вот дальше начинаются интересности.
Дело в том, что современные версии движка, начиная с 4.25, работают через Android Studio. А вот старые версии, в том числе и моя, через NVIDIA CodeWorks (совместимость можно проверить в Release Notes). И самое поганое, что NVIDIA закончила поддержку этого набора SDK.
С этого момента начинаются танцы с бубном. Во-первых, этот самый NVIDIA CodeWorks нужно скачать, причем определенной версии 1R7: заходим в архивы с инсталляторами. И видим, что без присоединения к программе NVIDIA Developer Program, скачать его не дадут. Нужно завести аккаунт, присоедниться к программе и повторно зайти в архив. Только после этого появится заветная ссылка.
Далее можно прочитать старую статью об установке этого пакета. Если сделать все как в ней написано, то игру то вы соберете. И даже зальете на свой телефон. Но, google ее не примет: минимальный уровень API в Google Play равен 28, а установится только 26-й. Поэтому вносим свои коррективы. И так, устанавливаем NVIDIA CodeWorks и в какой-то момент установки появится такое окошко:
Component Manager в NVIDIA CodeWorks
Менять можно только столбец Action, по нему и тыкаем. Если места много, то можно установить все. Если нет, то все дерево Developer Tools срубаем, как и всю документацию. Устанавливаем весь предложенный Android Toolchain, базовый Android SDK и дерево Android 8.0.0 (API 26). Все остально отключаем.
Теперь нужно избавиться от API 26 и поставить что-нибудь новее. Идем в папку, в которую установили NVIDIA CodeWorks и ищем в ней Android SDK Manager: android-sdk-windows\tools\android.bat .
Android SDK Manager
Все что он предлагает удалить — удаляем. Заодно сносим и ранее установленный API 26. Я работаю с Android 10 (API 29), можно накатить все, но достаточно будет и SDK Platform. Все что утилита предлагает обновить — обновляем.
Ребут, молельный танец и можно программить.
Подготовка проекта игры
Тут все дико зависит от проекта, поэтому рассказ только про мой опыт. Без большого тестового стенда устройств, гарантировать запуск игры и приемлемый FPS очень сложно. Поэтому платная версия отпадает, надо дать игроку «пощупать» игру преждем чем определяться с покупкой. Значит будет внутренняя покупка и нужен плагин OnlineSubsystemGooglePlay.
Теперь интересное. Без изменений он не подойдет, получите от гугла варнинг в духе: «We’ve detected that this app is using an old version of Google Play Billing». Вроде как до ноября работать будет, но потом все отвалиться. Создаем папку Plugins в своем проекте (если ее нет) и копируем в нее плагин из движка. Путь к плагину в движке такой: Engine\Plugins\Online\Android\OnlineSubsystemGooglePlay . У себя в проекте городить сложные пути не надо, просто в Plugins закинуть и все.
В скопированном плагине открываем файл: Plugins\OnlineSubsystemGooglePlay\Source\OnlineSubsystemGooglePlay_UPL.xml и вставлем в тег root такой код:
Например, после закрытия тега . Все, google задобрили. С покупкой будет еще один маленький нюансик, о котором я расскажу позже. Еще можно удалить папку Intermediate в плагине, для успокоения совести и гарантированной пересборки при следующей компиляции.
На этом подготовка закончена. Можно заново генерировать sln-файл для проекта игры, и открывать его в студии. По идее компиляция не должна добавить новых проблем, так как редактор собирается для x64 платформы майкрософтовским cl. А вот когда собираешь андроид сборку, можно огрести проблем от компилятора, ведь сборка идет в gcc. Но, у меня их небыло: все ошибки я отловил когда готовил сборку для macOS.
Project Settings…
Читаем документацию, куда же без нее? Мне этого не хватило… И остальной документации тоже. Я не буду расписывать настройки для отладки, поговорим только о Shipping версии. Поэтому в разделе Project -> Packaging выставляем Build Configuration в Shipping и ставим галки на Full Rebuild и For Distribution:
Далее идем в Platforms -> Android и тут начинается самое веселье. Очевидные вещи я пропущу, все можно найти на просторах интернета, ну или спросить тут. А вот на нехороших моментах остановлюсь подробнее.
Первое — это Store Version. Она должна быть уникальной, для каждой сборки которую мы готовим. В Google Play их должно быть минимум две: 32- и 64-битные. Эпики заботливо дали дополнительные смещения для этих сборок:
Store Version offset
Вот только они не работают. Точнее у меня работало так, что 64-битная сборка крашилась на старте быстро, тихо и не оставляя следов. Причина простая: для каждой сборки генерируется также свой OBB файл ресурсов, у которого имя содержит этот самый Store Version + offset. И, «естественно», при поиске этот offset игнорируется. У меня offset в 1 был у 64-битной версии, obb файл содержал номер 116 (например), а игра искала 115-й файл, не находила и завершалась. А со смещением ноль 32-битная версия работала отлично.
Выход? Все ручками! Выставляем Store Version и собираем только 32-битную версию. Затем меняем Store Version и собираем только 64-битную версию. Коряво? Зато дешево, надежно и практично!
Следующая проблема с которой я разбирался — это сохранения игрока. Мы никакой дичи в игре не творим, используем стандартные методы UE4. Но без танцев с бубном, даже они не работали. Первым делом ставим галку:
Во-первых, работает эта галка только в Shipping версии! Во-вторых, без нее в папке пользователя будет создан каталог UE4Game, куда и будут скидываться все настройки и сохранения. А с ней, все должно ложиться в секретную папочку /data/* , или куда там складывают настройки всех приложений. И по идее, на этом все проблемы решены.
Но, не на Android 10! Не везде, но в интернете ходят легенды (и я этот баг поймал на Galaxy Tab), что сэйвы не работают. Именно поэтому пришлось установить свежий SDK. Также нужно указать в Target SDK Version минимум 29 (Android 10), а лучше 30 (Android 11). И добавить дополнительные разрешения:
Дополнительные разрешения
И продублирую кодом для DefaultEngine.ini:
Были еще небольшие заморочки с подписью приложения, но это из-за моей невнимательности. Просто на будущее: НЕ ТЕРЯЙТЕ ФАЙЛ КЛЮЧЕЙ. Для его замены придется общаться с тех. поддержкой гугла, а это долго и нудно.
Изменения в коде и ассетах
Для меня самой крупной модификацией было новое управление в игре. Пришлось полностью переписать метод APlayerController::InputTouch и всем акторам добавить реакцию на касания. Естественно, по мелочи было очень много правок во всем коде, но глобальных изменений они не повлекли.
По рендеру. Mobile HDR оставил включенным. Все материалы были принудительно переведены в режим Fully Rough. Пришлось полностью отказаться от Refraction и от Pixel Depth Offset. Я боялся, что будут тормозить Masked материалы, но они особо на FPS не повлияли и я оставил их в покое. Освещение как было полностью динамическим, так и осталось. Тени включены на высоких и эпик настройках и полностью отключил на низких и средних.
Кстати, если вы собираетесь управлять графонием через Scalability Settings, то не забудьте перелопатить все Window -> Developer Tools -> Device Profiles . Они имеют повышенный приоритет. Я долго соображал, почему у меня никак не отключаются тени на планшете, пока внимательно не прочитал лог.
По мешам правок было немного. Полигонаж у нас невысокий, правда объектов на поле многовато, но мои устройства справлялись нормально. Пришлось порезать крупные меши на небольшие кусочки. Дело в том, что на меш может влиять только 4 источника света (три если есть один направленный, типа солнца). И на некоторых крупных объектах пропадало освещение от факелов. В остальном, никаких проблем не заметил.
Крупные исправления были в UI. Пришлось поднять в настройках проекта Application Scale до 1.2 и из-за этого часть диалоговых окон «поплыла». А еще я покупку реализовал именно внутри UI и полностью на Blueprints. И с ней возник один неприятный момент, о котором хочу рассказать.
Для работы in-app purchase есть три метода: Read In App Purchase Information (общие сведения о покупке), Make an In-App Purchase (сделать покупку) и Restore In-App Purchases (восстановить покупку на другом девайсе). Из особенностей хочу отметить только то, что у make и restore лучше всего объединять ветки On Success и On Failure в одну, а проверять именно Completion Status:
Проверка успешности восстановления покупки
Но не будем отвлекаться. Рассказываю о неприятности. Покупка была реализована просто: автоматом делаю read и проверяю результат, если все хорошо, то пытаюсь восстановить (restore) покупку, если все плохо — то интырнета нет и рыпаться не стоит. Если игрок жмякнул make, то просто проверяю успешность операции. И вылезла неприятная особенность: делаем покупку на одном из устройств. На другом отключаем инет и заходим в игру. И в этот момент или плагин или андроид делают гадость: они у себя кэшируют пустой список покупок для restore. Как итог при последующем входе с интернетом, покупка не восстанавливается, а купить ее нельзя, потому что make будет писать, что покупка есть и возвращать Cancelled. Выход из ситуации такой, в случае если make возвращает ошибку, заново делать restore, кэш очищается и все работает хорошо. Причем, это я увидел в исходниках другой игры и, пока сам не напоролся на баг, долго ломал голову, зачем они так сделали.
Как пойдет игра я не знаю, но потыкать в мобильный рынок палочкой точно стоит. Попробуем порекламировать ее или поищем издателя. Надеюсь, что результат будет поводом для еще одной статьи.
Сейчас у нас проходит открытое тестирование, вы можете присоединиться по ссылкам ниже. По этой ссылке можно присоединиться к тестированию через сайт. А по этой ссылке можно присоединиться к тестированию в Google Play на устройстве Android. Ну и добавить нас в список желаемого можно тут.
Я буду крайне признателен за любой фидбэк и тесты! И спасибо за то, что дочитали до этого места!
Источник
Разработка приложений на Unreal Engine 4
Существует множество способов разработки игр для Android, и одним из лучших способов 3D разработки является использование движка. Движок предоставляет основу для создания 3D-сеток из 2D-изображений, физики, реалистичного освещения и многих других функций, реализация которых с нуля была бы трудоемкой для разработчика. Одним из таких движков является Unreal Engine.
Unreal Engine, созданный в 1998 году компанией Epic Games, является движком, созданным в первую очередь для жанра шутеров от первого лица. При этом не существует ограничений и движок может использоваться для самого разного типа игр. Стоит отметить, что движок является полностью бесплатным для любых некоммерческих проектов (для платных игр разработчики запрашивают 5% прибыли, но только в том случае, если доход превышает 3000$ в квартал). Последняя версия движка, Unreal Engine 4, поддерживает все платформы и операционные системы, включая Windows, Linux, OS X, Android, Xbox One, PlayStation 4 и Ouya, а также поддерживает множество различных графических API, таких как DirectX 11 и 12, OpenGL, Vulkan и JavaScript/WebGL. Unreal Engine очень универсален, и несмотря на то, что он немного сложнее в использовании, чем Unity, он предоставляет очень обширные функциональные возможности и непревзойдённую графику.
В этой статье мы рассмотрим, как установить и настроить Unreal Engine для работы в Android, а также соберём стартовый проект.
Шаг 1. Установка Unreal Engine
Для того, чтобы установить Unreal Engine 4, вам понадобится зарегистрировать учётную запись (или авторизироваться) на сайте Unreal Engine. После этого нужно скачать и установить программу Epic Games Launcher, нажав на этом же сайте кнопку Download.
Открыв Epic Games Launcher, перейдите на вкладку Unreal Engine.
Здесь можно прочитать последние новости сообщества, различные уроки, а также приобрести различные товары, связанные с движком. Чтобы начать установку, нажмите «Установить движок». Вам будет предложено выбрать путь установки.
Нажав на «Установить», откроется окно, в котором будет предложено выбрать, какие компоненты следует установить.
Оставим основные компоненты как есть и в целевых платформах укажем Android (если вы хотите разрабатывать и под другие платформы, просто поставьте флажок на нужных). После того, как вы нажмёте «Применить», начнётся установка Unreal Engine.
После завершения установки вы увидите Unreal Engine в библиотеке Epic Games Launcher.
Шаг 2. Установка NVIDIA CodeWorks for Android
NIVIDA CodeWorks это набор инструментов для GPU и CPU, также включающий в себя Android SDK и различные библиотеки для разработки под Android, причём не только на устройствах Tegra.
Чтобы установить его, нужно скачать установщик, перейдя на сайт NVIDIA и нажав на Download. Либо, если Шаг 1 уже выполнен и Unreal Engine установлен, вы можете найти установщик в папке с движком, путь до него выглядит следующим образом: — Engine — Extras — AndroidWorks — .
Примечание: в случае, если у вас установлена Android Studio вместе с Android SDK, переменные среды имеют значения для текущего Android SDK. Однако после установки NVIDIA CodeWorks установщик перезапишет эти значения на те, которые требуются для CodeWorks, имейте это ввиду.
Запустив установщик, вам будет предложено выбрать, какие компоненты следует установить.
Выберите Standard, Full или Custom в зависимости от того, какие компоненты вы хотите установить. Как правило, стандартного набора для начала более чем достаточно.
После того, как вы определитесь с компонентами, нажмите Next, примите лицензионное соглашение, и установщик начнёт загрузку и инсталляцию выбранных компонентов. При завершении вы увидите сообщение об окончании установки.
Шаг 3. Создание нового проекта
Запустив Unreal Editor, вы попадёте на экран создания нового проекта.
Здесь доступны самые разные пресеты для проекта, однако в нашем случае для приложения на Android выставите следующие параметры:
- выберите Third Person в списке проектов (Blueprint).
- в качестве целевой платформы выберите Mobile/Tablet.
- уровень графики укажите Scalable 3D or 2D.
- выберите No Starter Content.
Также не забудьте указать имя проекта и путь до него. Когда всё будет готово, нажмите Create Project и Unreal Editor создаст проект с заданными параметрами.
Шаг 4. Настройка проекта
Перед тем, как начать сборку и запуск проекта, нужно настроить некоторые параметры. Для этого нажмите на стрелку рядом с меню Settings и выберите Project Settings.
В открывшемся окне перейдите в раздел Platforms — Android SDK. Здесь нужно прописать пути до установленных с помощью NVIDIA CodeWorks компонентов.
Теперь перейдите в раздел Platforms — Android. Здесь настраивается основная информация о приложении (имя пакета, версия, минимальный и целевой SDK, иконка приложения), а также многие дополнительные параметры.
В разделе APKPackaging нажмите Accept SDK License, чтобы принять лицензионное соглашение. После этого в разделах APKPackaging и Google Play Services нажмите Configure Now, чтобы сконфигурировать файлы проекта.
После этого укажите имя пакета, название приложения, а также минимальный и целевой SDK.
При желании вы также можете изменить и другие параметры.
Примечание: по умолчанию сборкой проекта занимается Gradle. Если вы хотите использовать в качестве сборщика проекта Apache Ant, уберите флажок с поля Enable Gradle instead of Ant.
На этом настройка проекта завершена и вы можете просто закрыть окно настроек.
Шаг 5. Сборка и запуск проекта
По умолчанию, в проекте загружен уровень ThirdPersonExampleMap.
Воспользуемся им для запуска приложения. Перед началом сборки подключите устройство, на котором вы хотите запустить проект, по USB, предварительно активировав на устройстве отладку по USB.
Затем в меню нажмите на стрелку рядом с пунктом Launch и выберите подключенное устройство.
После этого начнётся сборка проекта с последующим запуском на устройстве.
Примечание: на слабом железе сборка может занять длительное время.
Как только сборка будет завершена, вы увидите собранный уровень на своём устройстве и сможете взаимодействовать с ним.
Примечание: во время сборки может возникнуть ошибка, показанная ниже.
В этом случае вам нужно выполнить следующие действия:
- Запустите из установленного NVIDIA CodeWorkds файл /tools/android.bat.
- Нажмите Deselect All.
- Поставьте флажок на Android Support Repository в разделе Extras.
- Нажмите Install.
После этого репозиторий поддержки обновится и ошибка должна пропасть.
В данном примере мы управляем персонажем, расположенным в комнате, с помощью двух виртуальных «стиков», управляющих движением персонажа и поворотом камеры.
Данный уровень является лишь заготовком, при желании вы можете разработать любую игру, используя Unreal Engine.
Посмотрим, что получилось в результате в APK-файле. Воспользуемся утилитой Android Studio под названием APK Analyzer, которая позволяет узнать, какие файлы содержит в себе APK и сколько места они занимают.
Итоговый APK-файл имеет размеры 45,5 MB и 44,7 MB в несжатом и сжатом виде соответственно и включает в себя следующие файлы.
Как можно увидеть, кроме стандартных файлов приложения имеются также сторонние библиотеки, занимающие большую часть APK, которые были добавлены в проект движком. Кроме того, APK содержит в себе 4932 класса и 27574 метода.
Если посмотреть содержимое файла AndroidManifest.xml, то можно обнаружить, что приложение запрашивает следующие разрешения:
- android.permission.INTERNET
- android.permission.WRITE_EXTERNAL_STORAGE
- android.permission.ACCESS_NETWORK_STATE
- android.permission.WAKE_LOCK
- android.vending.CHECK_LICENSE
- android.permission.ACCESS_WIFI_STATE
- android.permission.MODIFY_AUDIO_SETTINGS
- android.permission.VIBRATE
Таким образом, с помощью нескольких шагов мы установили и запустили на устройстве приложение, построенное на движке Unreal Engine 4.
Разработка приложений на Unreal Engine 4 : 6 комментариев
Кому интересно как снизить вес АПК-шки, на официальном форуме в соответствующей ветке, есть темы, где расписывают, как убрать лишние «библиотеки» и чаще всего не нужные зависимости, при билде апк(для iOS тоже подойдёт). Называется что-то вроде «Черного списка»
На каком официальном сайте? Андроид или анреал?
Искать «Черный список» на русском или black list?
У меня при компиляции на телефоне не видны модели персонажей, когда на компе всё норм. Даже создавал локальную сессию, на компе видел своего персонажа и персонажа управляемого с телефона, а вот на телефоне оба персонажа невидимы. В чем проблема?
На телефоне хорошо выглядит в landscape режиме, если переключить в portrait режим, то сразу идет растяжение и тд , камеру надо настраиввать под разрешение экрана, есть статья на эту тему?
Подскажите, все сделал как в гайде. телефон подключил его находит все окей, но я нажимаю лаунч чтоб запустить тест на телефоне и ue4 закрывается. прекращает работу просто и все. 100 раз уже пробовал. кто-нибудь в курсе?
Источник