В этом руководстве описывается типичный цикл разработки игры. Прочитав это руководство, возможно, вам будет полезно использовать его в качестве справочного материала.
Когда вы работаете с Unity, жизненный цикл разработки состоит из трех этапов:
- План и дизайн
- Разрабатываем и тестируем
- Публикация и поддержка
План и дизайн
На этапе планирования и проектирования вы определяете, как создавать свою игру. Вы решаете, как решить проблемы разработки для мобильных устройств, и определяете инструменты и процессы, которые будут использоваться при разработке.
Получите информацию от всех членов команды
Работайте со своими художественными, инженерными, дизайнерскими, звуковыми и производственными группами, чтобы определить и записать задачи реализации. Например:
- Художественные команды могут создавать текстуры активов и бюджеты сеток для персонажей и окружения.
- Инженеры могут определить контрольные точки памяти и производительности для профилирования для каждой платформы.
- Дизайнер может спланировать игровую механику, обеспечивающую этот опыт.
- Эксперты по аудио могут рассмотреть требования к непрерывности звука между пользовательским интерфейсом, 2D и 3D пространственными звуками.
- Производство может сообщать о требованиях к запуску и поддерживать согласованность действий команды и ее соблюдение.
Дизайн для мобильных устройств
Разработка приложений для мобильных платформ требует определенных факторов, таких как:
- Переменные соотношения сторон экрана
- Потребляемая мощность
- Тепловое регулирование и регулирование процессора
- Сенсорный ввод
- Кроссплатформенная разработка
- Графические API (Vulkan или OpenGL ES)
Подробные сведения об особенностях проектирования для мобильных устройств см. в разделе Разработка Android в Unity от Unity и в Академии Google Play .
Разрабатываем и тестируем
На этапе разработки и тестирования вы создаете свою игру, проводите тестирование и подготовку к запуску. Вы проводите ограниченное внутреннее тестирование в Google Play, чтобы подготовиться к выполнению требований к запуску. Вы совершенствуете свою стратегию развертывания и организуете ресурсы в Unity на основе систем Play Asset Delivery и Unity Addressables .
В следующих разделах описаны инструменты и методы Unity, которые помогут вам разрабатывать приложения для Android.
Оказывать
Рендеринг — это процесс рисования 3D- и 2D-ресурсов из вашей сцены Unity на экране. Хотя механизм Unity занимается рендерингом, важно учитывать несколько факторов для платформы Android.
Текстуры
Определите, нужны ли вам текстуры самого большого размера, в зависимости от ваших целевых устройств. При профилировании распределения памяти обратите внимание на потенциальную экономию при изменении целевого размера текстуры.
Время кадра
Чтобы предотвратить перегрев на устройствах Android, установите целевые значения времени кадра в среднем менее 21 миллисекунды. Иногда, например, во время загрузки или коротких видеороликов, время кадра может превышать 21 миллисекунду, но для основного игрового процесса вы должны оставаться ниже порога в 21 миллисекунду.
На мобильных платформах принудительная VSync ограничивает частоту кадров, если вы не достигаете минимальной цели. Например, при обновлении экрана с частотой 60 Гц, если вы не наберете 60 кадров в секунду, ваша игра будет снижена до 30; если вы не наберете 30, ваше число будет ограничено до 15.
Многие устройства Android поставляются с частотой обновления экрана 60 Гц и 120 Гц. Взвесьте преимущества гораздо меньшего времени кадра (целевое значение 10 мс для обновления 60 Гц и 5 мс для 120 Гц) без риска термического регулирования и разрядки батареи для более высокой скорости рендеринга.
Чтобы установить определенную частоту кадров в вашей игре в Unity, используйте Application.targetFrameRate .
Библиотека Android Frame Pacing помогает обеспечить плавный рендеринг, когда вашему приложению требуется больше времени для отображения следующего кадра, чем требует частота обновления экрана. В версиях Unity 2021 и более поздних версиях при включении синхронизации кадров Android частота обновления экрана устанавливается так, чтобы она наилучшим образом соответствовала целевой частоте кадров. Это гарантирует, что игра не будет тратить заряд батареи на ненужные обновления дисплея.
Чтобы включить библиотеку, в разделе «Настройки проекта» > «Проигрыватель » в разделе «Настройки для Android» установите флажок «Оптимизированная скорость кадров» .
![Диалоговое окно, показывающее «Настройки проекта» > «Настройки игрока» > «Оптимизированный темп славы».](https://developer.android.com/static/images/games/engines/unity/unity-projectsettings-player.png?hl=ru)
Вулкан API
Vulkan — это кроссплатформенный высокопроизводительный API 3D-графики с меньшими накладными расходами по сравнению с OpenGL ES. Unity может использовать Vulkan двумя разными способами.
API автоматической графики
Вы можете использовать Auto Graphics API с Vulkan, но это может иметь разное поведение в зависимости от установленной версии Unity. Вы можете выбрать это, перейдя в «Настройки проекта» > «Плеер» > «Рендеринг» .
При выборе версии Unity следует учитывать следующие соображения:
- Unity 2021.1 и более ранние версии не поддерживают Vulkan с API Auto Graphics. Unity пытается использовать OpenGL ES 3.2. Если устройство не поддерживает OpenGL ES 3.2, Unity возвращается к OpenGL ES 3.1, 3.0 или 2.0 в указанном порядке.
- Unity 2021.2 и более поздние версии сначала используют Vulkan. Если устройство не поддерживает Vulkan, Unity возвращается к OpenGL ES 3.2, 3.1, 3.0 или 2.0.
![Настройки проекта > Настройки проигрывателя > Рендеринг > Auto Graphics API](https://developer.android.com/static/images/games/engines/unity/unity-auto-graphics-api.png?hl=ru)
Ручные графические API
Кроме того, вы можете включить Vulkan вручную, отключив Auto Graphics API. Если вы используете Unity 2021.1 или более раннюю версию, это единственный способ использовать Vulkan.
Если Vulkan в этом списке стоит выше, чем OpenGL ES, Unity сначала пытается использовать Vulkan. Если устройство не поддерживает Vulkan, Unity работает с OpenGL ES. Подробную информацию о Vulkan для Android, например, о том, как использовать современные графические API и оптимизировать производительность игры, см. в разделе «Начало работы с Vulkan».
![Настройки проекта > Настройки проигрывателя > Рендеринг > Графические API](https://developer.android.com/static/images/games/engines/unity/unity-graphics-apis.png?hl=ru)
Нарисовать звонки
Все, что отображается на экране, связано с одним или несколькими вызовами отрисовки. На мобильных платформах вам следует оптимизировать и сократить количество вызовов отрисовки, отправляемых графическому процессору (GPU).
Думайте о вызовах отрисовки как о машинах, выстроившихся в очередь на светофоре. После того, как свет загорится зеленым, определенное количество автомобилей может проехать до того, как свет поменяется. Когда индикатор загорится желтым, вы достигли идеального целевого времени кадра (21 миллисекунда), а когда индикатор станет красным, вы достигли предела времени кадра в 33 миллисекунды. Все, что происходит дальше, влияет на следующий кадр рендеринга, поэтому результирующая частота кадров оказывается ниже целевых 30 кадров в секунду.
Информацию о том, как повысить производительность вызова отрисовки в вашей игре, см. в статье о пакетной обработке на сайте поддержки Unity.
Тени
Вызовы отрисовки отбрасывания теней могут быть наиболее ресурсоемкими для графического процессора и отнимать большую часть времени графического процессора даже в простых средах. Чтобы снизить стоимость вызовов отрисовки отбрасывания теней, поэкспериментируйте с использованием жестких теней вместо мягких. Если это по-прежнему слишком затратно для графического процессора для устройств начального уровня, рассмотрите возможность использования BLOB-теней вместо жестких теней.
Текстура
Рекомендуемый формат сжатия текстур RGB и RGBA на Android — ASTC. В Unity минимальный вариант сжатия текстур, который следует использовать на Android, — ETC2. Вы можете вернуться к ETC2 в качестве резервной копии ASTC в разделе «Настройки сборки Unity» .
Полный список поддерживаемых форматов по платформам можно найти в документации Unity в разделе «Руководство: рекомендуемые, стандартные и поддерживаемые форматы текстур по платформам» .
Пользовательский интерфейс и соотношение сторон
Вы можете использовать инструмент Unity Device Simulator для предварительного просмотра различных разрешений экрана, ориентации и соотношения сторон устройства непосредственно в редакторе Unity. Вы можете переключаться между видом игры и режимом симулятора устройства.
Предварительный просмотр этого инструмента см. в статье «Смоделируйте свою игру с помощью Device Simulator в Unity»! .
![](https://developer.android.com/static/images/games/engines/unity/unity-trivialkart-scene.png?hl=ru)
Исходный код Trivial Kart можно найти в репозитории примеров игр на Github.
Вы можете быстро проверить макет и правильность элементов холста пользовательского интерфейса в представлении «Симулятор устройства», выбрав параметры устройства в раскрывающемся меню:
![Настройки проекта > Настройки проигрывателя > Оптимизированная скорость кадров](https://developer.android.com/static/images/games/engines/unity/unity-multiple-device-test.png?hl=ru)
![Настройки проекта > Настройки игрока > Оптимизированный темп славы](https://developer.android.com/static/images/games/engines/unity/unity-package-manager.png?hl=ru)
Дополнительные методы оптимизации пользовательского интерфейса для Unity см. в следующем руководстве от Unity: Оптимизация Unity UI .
Физика
Движок Nvidia PhysX встроен в Unity. Настройки по умолчанию могут оказаться дорогостоящими на мобильных устройствах, поэтому имейте в виду следующие соображения:
- Учитывайте целевую частоту кадров и соответствующим образом установите фиксированный временной интервал. По умолчанию установлено значение 0,02 мс или 50 Гц. Вы можете увеличить его до 0,03 или выше для целевой частоты 30 кадров в секунду.
- Рассмотрите возможность упрощения коллайдеров сетки и минимизации матрицы столкновений слоев для определения взаимодействия между игровыми объектами определенных типов слоев.
Информацию о настройках физики и оптимизации для мобильных игр см. в электронной книге «Оптимизируйте свои мобильные игры» от Unity.
Профиль
Разработчики приложений часто упускают из виду или игнорируют профилирование до тех пор, пока приложение не достигнет критической точки отказа. Рекомендуется запланировать в своем процессе специальное время для профилирования и использовать следующие рекомендации:
- Определите ключевые моменты во время разработки, когда вы можете распределить время профилирования, а не распределять его случайным образом.
- Сохраняйте снимки профиля для использования с Unity Profile Analyzer .
- Профилируйте свою игру на целевых устройствах, чтобы получить точную картину того, как ваша игра работает на текущем этапе разработки.
- Профилируйте различные части вашей игры.
- Опишите, как ваши игроки играют в игру. (Не профилируйте свою игру только тогда, когда она находится в состоянии ожидания или на экране паузы.)
- Профилируйте в устойчивом режиме после того, как игра поработала некоторое время, чтобы помочь обнаружить проблемы с регулированием, с которыми вы можете столкнуться, когда мобильные устройства перегреваются .
Вы можете использовать следующие инструменты профилирования отдельно или в сочетании.
Unity Profiler Unity Profiler — это полностью интегрированный инструмент анализа производительности, который может работать с вашим кодом в редакторе Unity и подключаться к вашему автономному устройству Android, на котором выполняются сборки в режиме разработки.
Инспектор графического процессора Android С помощью инспектора графического процессора Android ( AGI ) вы можете выполнять отладку на уровне кадров. AGI также анализирует системные службы, включая счетчики графического процессора, процессора, памяти, батареи и графического процессора.
Подробную информацию о профилировании игры в Unity можно найти в видеоролике «Введение в профилирование в Unity» или прочитать полное руководство по профилированию игр Unity , оба из Unity.
Управление памятью
Процессы Android совместно используют доступную память на целевом устройстве. Вам следует профилировать использование памяти, если на целевом устройстве тестирования имеется достаточно свободных ресурсов памяти. Выполняйте тесты памяти в определенные моменты игры, чтобы можно было соответствующим образом сравнивать сеансы и тенденции использования памяти.
При работе со сценариями, написанными на C#, будьте осторожны при использовании строк, сравнении строк и выделении объектов, связанных со строками (например, файлов JSON для настроек игры). Это приводит к частому выделению памяти и может способствовать фрагментации.
Рассмотрите возможность использования класса StringBuilder для больших последовательностей манипуляций со строками вместо объединения строк на месте (например, «это» + «есть» + «а» + «плохой» + «идея» вместо вызовов функций StringBuilder.Concat()
). .
Дополнительные сведения о строках см. в разделе «Строки и текст» документации Unity.
Оцените текстовые ресурсы TextAsset и JSON по предпочтительному типу ScriptableObject
. ScriptableObjects
эффективно обрабатывают межсценовое хранение данных и позволяют изменять время перехода от редактора к воспроизведению.
Обсуждение использования альтернатив дескриптору JSON по умолчанию для мобильной оптимизации см. в статье «Скрытая оптимизация в сетевых играх» на сайте Hutch.
Используйте API-интерфейс Memory Advice , чтобы определить, как выглядит использование памяти во время выполнения. API предоставляет индикатор светофора для высокого, нормального и низкого использования памяти. Вы можете подписаться на индикатор для получения обновлений или опросить его напрямую, чтобы узнать текущий статус. Когда вы получите красный сигнал, рассмотрите возможность уменьшения пула или кэша игровых объектов. Включите этот контекст в телеметрию вашей игры во время живых операций и просмотрите показатели производительности после запуска.
Более подробно об организации памяти на устройствах Android и о том, как с ней работает Unity, смотрите в статье «Понимание использования памяти Android» (из Google I/O '18) . В видео рассказывается о типах проблем с памятью и о том, когда вступает в силу средство устранения нехватки памяти.
Сбор мусора
Сборка мусора в среде управляемой памяти очищает неиспользуемые фрагменты памяти, которые можно повторно использовать для приложения. Следуйте рекомендациям по сбору мусора , чтобы избежать ненужного выделения ресурсов памяти.
Например, создайте пул игровых объектов вместо использования выделения по требованию ( GameObject.Instantiate
). Для больших пулов рассмотрите возможность выделения нескольких кадров, чтобы снизить риск зависания игры на устройствах Android начального уровня.
Рассмотрим следующий фрагмент кода для простой сопрограммы, которая вызывается в начале MonoBehaviour:
// Option 1: Bad for memory management - causes allocation each iteration
IEnumerator UpdateEnemyTarget() {
while (enabled) {
yield return new WaitForSeconds(1.0f);
// Some intermittent function check
}
}
// Option 2: Better for memory management - allocation of yield instruction once, reused each iteration
private YieldInstruction waitForSecond = new WaitForSeconds(1.0f);
IEnumerator BetterUpdateEnemyTarget() {
while (enabled) {
yield return waitForSecond;
// Some other intermittent function
}
}
Вы можете отредактировать файл шаблона MonoBehaviour, удалив функции-заглушки Start()
и Update()
по умолчанию, чтобы случайно не оставлять пустые функции во время разработки.
Обзор порядка выполнения событий MonoBehaviour см. в разделе Порядок выполнения функций событий в документации Unity. Подробнее об управлении памятью читайте в курсе «Управление памятью в Unity» .
Советы по оптимизации производительности мобильных игр см. в разделе Оптимизация производительности мобильных игр: советы по профилированию, памяти и архитектуре кода от лучших инженеров Unity .
Объединение префабов
Скачки времени кадра ЦП почти полностью вызваны созданием экземпляра Prefab во время игры. Подумайте о предварительном разогреве пулов объектов для снарядов, появляющихся врагов и визуальных эффектов перед входом в игровой процесс, чтобы уменьшить или устранить скачки нагрузки на процессор при запуске. Вы можете распределить дополнительные оптимизации по нескольким «кадрам инициализации» во время загрузки или введения в сцену.
В Unity Asset Store можно найти множество сторонних пулов ресурсов, связанных с управлением пулами игровых объектов. Вы также можете создать свой собственный. См. раздел «Введение в пул объектов» в Unity Learn .
Доставка активов
Существуют ограничения на размер вашего приложения при его первом развертывании в Google Play. В зависимости от размера и характера вашей игры вам могут потребоваться некоторые или все ваши игровые ресурсы (модели персонажей, окружение, элементы пользовательского интерфейса и т. д.), чтобы игроки могли получить желаемый опыт.
Вы можете использовать службу доставки ресурсов Play (PAD) для управления ресурсами, которые требуются вашей игре во время установки, быстрого отслеживания или по требованию. Unity Asset Bundles интегрированы для поддержки PAD, и вы можете использовать этот инструмент, чтобы указать, какие элементы доставляются.
Адресные
Настройка динамических ресурсов, таких как префабы, текстуры и звуковые файлы, во время выполнения больше не является сложной операцией, если вы подготовите и проверите систему именования Addressables. Адресные ресурсы отделяют то, как вы упорядочиваете свой контент, от того, как вы его создаете и загружаете. Система Addressables заменяет папки Resources и Asset Bundles, упрощая способ обращения к ресурсам и их загрузки во время выполнения.
Пример см. в демонстрационном проекте с использованием пакета Addressables на GitHub. Подробности о разработке Addressables см. в разделе Addressable Asset System в блоге Unity .
При адресной компоновке ресурсов объединение слишком малого или слишком большого количества ресурсов в общие пакеты имеет свои преимущества и недостатки. Дополнительные сведения об управлении контентом с помощью Addressables см. в разделе Упрощение управления контентом с помощью Addressables .
Вы можете настроить отдельную демо-версию и поэкспериментировать с режимами доступа, чтобы освоиться с системой Addressables. Вы также можете просмотреть проект с открытым исходным кодом BuildLayout Explorer для Unity 2019.3 и более поздних версий и просмотреть отчет buildlayout.txt
, созданный Addressables.
Ресурсы для Chop Chop, открытого проекта Unity, были упакованы с использованием системы Addressables для всей загрузки и выгрузки. См. Упаковка содержимого с помощью адресных ресурсов | Откройте журнал разработчиков Projects для ознакомления со структурой и настройкой настройки пакетов Addressables.
В проекте Chop Chop единственная сцена, загружаемая по умолчанию, сцена инициализации, была настроена на использование AssetReferences
вместо прямых ссылок на ресурсы в проекте (сцены, префабы и т. д.).
Исходный код Unity Open Project: Chop Chop доступен на GitHub. Хотя проект больше не находится в разработке, репозиторий git и документация по-прежнему доступны.
Сторонние плагины
Если вы используете сторонние плагины, например, из Unity Asset Store, обязательно просмотрите папки и удалите ненужные ресурсы из папок «Ресурсы» . В процессе сборки Unity собирает все ресурсы, включенные в папки «Ресурсы» , и упаковывает их в один пакет, доступный во время выполнения. Это может увеличить размер конечного пакета и зачастую в этом нет необходимости.
Чтобы быстро найти все папки ресурсов, найдите «Ресурсы» на панели «Проект» . Затем вы можете выбрать каждый из них, чтобы определить, что он содержит и необходим ли он для вашей игры.
![](https://developer.android.com/static/images/games/engines/unity/unity-search-resources.png?hl=ru)
Публикация и поддержка
Когда вы будете готовы запустить свою мобильную игру, решите, для кого вы хотите ее выпустить, как проводить альфа- и бета-тестирование, а также как отслеживать производительность после запуска.
Анализируйте отзывы об ограниченном выпуске
Вы можете запустить игру для ограниченной целевой аудитории и провести масштабное бета-тестирование или активировать свою игру для полной доступности на всех рынках. С помощью ограниченной версии вы можете настроить производительность своего приложения с учетом более широкой аудитории и коллекции устройств.
Например, вы можете использовать Android Performance Tuner для Unity и Google Analytics для Unity, чтобы получить информацию о производительности вашего приложения и тенденциях игроков, на основе которой ваша команда разработчиков может настраивать и отправлять обновления. Вы также можете использовать свои аналитические данные для планирования продолжений или похожих игр в аналогичном жанре.
Альфа- и бета-тестирование
После настройки профиля приложения в консоли Google Play вы можете подготовить общедоступные сборки альфа- и бета-тестирования и распространить их среди ограниченной аудитории для проверки перед запуском. Запустив продукт для ограниченной аудитории, вы сможете решить любые финальные проблемы с большим количеством устройств и собрать первоначальные отзывы, на которые вы сможете отреагировать, прежде чем запустить глобальную версию.
Ваши сборки Unity распространяются через пакеты приложений Android. Дополнительную информацию см. в Руководстве: Доставка в Google Play из Unity, где также описаны изменения файлов APK в формате AAB.
Мониторинг и отслеживание
На этапе запуска и распространения игры вы можете использовать Android Vitals, чтобы отслеживать проблемы с производительностью на устройствах, к которым у вас, возможно, не было доступа во время разработки и тестирования. Подробные сведения см. в статьях «Что нового в играх в Reach и устройствах» и Android Vitals .
Зачастую более крупные команды разработчиков имеют уникальные и настраиваемые конвейеры игровой телеметрии, которые предоставляют показатели, связанные с производительностью устройства. Не забудьте воспользоваться Android Performance Tuner (APT) и соответствующим плагином Unity для получения показателей, связанных с частотой кадров, точностью графики, временем загрузки и прерыванием загрузки. Следуйте пошаговому руководству по интеграции Android Performance Tuner в вашу игру на Unity .
Жизненный цикл вашей игры не прекращается после ее запуска. Мониторинг, поддержка и реагирование на производительность и обратную связь имеют решающее значение для счастья пользователей, получения положительных отзывов и максимального распространения вашей игры на всех рынках.