Начните разработку игр в Unity

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

При работе с Unity жизненный цикл разработки состоит из трех этапов:

  • План и дизайн
  • Разработка и тестирование
  • Публиковать и поддерживать

План и дизайн

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

Получите мнения всех членов команды

Работайте с вашими командами художников, инженеров, дизайнеров, звукорежиссеров и продюсеров, чтобы определить и зафиксировать задачи по реализации. Например:

  • Команды художников могут создавать бюджеты текстур и сеток для персонажей и окружения.
  • Инженеры могут определить контрольные точки памяти и производительности для профилирования на каждой платформе.
  • Дизайн может планировать игровую механику, обеспечивающую этот опыт.
  • Эксперты по звуку могут пересмотреть требования к непрерывности звука между пользовательским интерфейсом, 2D и 3D пространственными звуками.
  • Производственный процесс может информировать о требованиях к запуску и согласовывать действия команды и обеспечивать ее соблюдение.

Дизайн для мобильных устройств

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

  • Изменяемые соотношения сторон экрана
  • Потребляемая мощность
  • Температурный и процессорный троттлинг
  • Сенсорный ввод
  • Кроссплатформенная разработка
  • Графические API (Vulkan или OpenGL ES)

Подробную информацию об особенностях разработки приложений для мобильных устройств можно найти в статьях «Разработка Android в Unity» от Unity и Google Play Academy .

Разработка и тестирование

На этапе разработки и тестирования вы создаёте игру, проводите тестирование и подготовку к запуску. Вы проводите ограниченное внутреннее тестирование в Google Play, чтобы подготовиться к выполнению требований к запуску. Вы уточняете стратегию развёртывания и организуете ресурсы в Unity на основе систем Play Asset Delivery и Unity Addressables .

В следующих разделах описываются инструменты и методы Unity, которые помогут вам разрабатывать приложения для Android.

Оказывать

Рендеринг — это процесс отрисовки 3D- и 2D-ресурсов из сцены Unity на экране. Хотя движок Unity отвечает за рендеринг, для платформы Android важно учитывать несколько факторов.

Текстуры

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

Время кадра

Чтобы предотвратить перегрев на устройствах Android, старайтесь поддерживать среднее время кадра менее 21 миллисекунды. Иногда, например, во время загрузки или коротких видеороликов, время кадра может превышать 21 миллисекунду, но для основной игры следует поддерживать порог в 21 миллисекунду.

На мобильных платформах принудительная вертикальная синхронизация снижает частоту кадров, если она не достигает минимального целевого значения. Например, при частоте обновления экрана 60 Гц, если частота кадров не достигает 60, игра снижается до 30 кадров в секунду; если частота кадров не достигает 30, снижается до 15 кадров в секунду.

Многие устройства Android поставляются с частотой обновления экрана 60 Гц и 120 Гц. Оцените преимущества значительного сокращения времени кадра (10 мс для обновления 60 Гц и 5 мс для 120 Гц) без риска перегрева и разрядки аккумулятора при более высокой скорости рендеринга.

Чтобы установить определенную частоту кадров в игре в Unity, используйте Application.targetFrameRate .

Библиотека Android Frame Pacing обеспечивает плавный рендеринг, когда приложению требуется больше времени на отображение следующего кадра, чем того требует частота обновления экрана. В Unity версий 2021 и более поздних включение Android Frame Pacing устанавливает частоту обновления дисплея, максимально соответствующую целевой частоте кадров. Это гарантирует, что игра не будет тратить заряд батареи на ненужные обновления экрана.

Чтобы включить библиотеку, в разделе «Настройки проекта» > «Проигрыватель» в разделе «Настройки для Android » установите флажок «Оптимизированный темп кадров» .

Диалоговое окно с настройками проекта > Настройки проигрывателя > Оптимизированный темп славы
Рисунок 1. Оптимизированный темп кадров доступен в настройках проигрывателя в Unity 2019.2 и более поздних версиях.

API Вулкан

Vulkan — это кроссплатформенный высокопроизводительный API для 3D-графики с низкими накладными расходами по сравнению с OpenGL ES. Unity может использовать Vulkan двумя способами.

API автоматической графики

Вы можете использовать Auto Graphics API с Vulkan, но его поведение может отличаться в зависимости от установленной версии Unity. Вы можете выбрать эту функцию, перейдя в раздел «Настройки проекта» > «Проигрыватель» > «Рендеринг» .

При выборе версии Unity учитывайте следующие соображения:

  • Unity 2021.1 и более ранние версии не поддерживают Vulkan с Auto Graphics API. 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.
Настройки проекта > Настройки проигрывателя > Рендеринг > API автоматической графики
Рисунок 2. Настройка API автоматической графики.

API ручной графики

Вы также можете включить Vulkan вручную, отключив Auto Graphics API. Если вы используете Unity 2021.1 или более раннюю версию, это единственный способ использовать Vulkan.

Если Vulkan в этом списке стоит выше OpenGL ES, Unity сначала попытается использовать Vulkan. Если устройство не поддерживает Vulkan, Unity работает с OpenGL ES. Подробную информацию о Vulkan на Android, например, о том, как использовать современные графические API и оптимизировать производительность игры, см. в разделе «Начало работы с Vulkan ».

Настройки проекта > Настройки проигрывателя > Рендеринг > Графические API
Рисунок 3. Ручная настройка графических API при отключенном Auto Graphics API. Vulkan — первый вариант. Unity использует OpenGL ES 3.0.

Коллы на ничью

Всё, что отображается на экране, связано с одним или несколькими вызовами отрисовки. На мобильных платформах следует оптимизировать и сократить количество вызовов отрисовки, отправляемых графическому процессору (GPU).

Представьте себе вызовы отрисовки как автомобили, выстроившиеся в очередь на светофоре. После того, как загорится зелёный сигнал, определённое количество автомобилей может проехать, прежде чем сменится сигнал. Когда загорится жёлтый сигнал, вы достигли идеального целевого времени кадра (21 миллисекунда), а когда загорится красный сигнал, вы достигли лимита в 33 миллисекунды. Всё, что больше этого, влияет на следующий кадр рендеринга, поэтому результирующая частота кадров ниже целевых 30 кадров в секунду.

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

Тени

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

Текстура

Рекомендуемый формат сжатия текстур для RGB и RGBA на Android — ASTC. В Unity минимальный рекомендуемый формат сжатия текстур на Android — ETC2. Вы можете использовать ETC2 в качестве резервного варианта ASTC в настройках сборки Unity .

Полный список поддерживаемых форматов по платформам можно найти в документации Unity в разделе Руководство: рекомендуемые, используемые по умолчанию и поддерживаемые форматы текстур по платформам .

Пользовательский интерфейс и соотношения сторон

Инструмент Unity Device Simulator позволяет просматривать различные разрешения экрана, ориентации и соотношения сторон устройств непосредственно в редакторе Unity. Можно переключаться между режимами «Игра» и «Симулятор устройства».

Ознакомьтесь с предварительным обзором инструмента на странице Моделируйте свою игру с помощью Device Simulator в Unity!.

Рисунок 4. Симулятор устройства, на котором запущен Trivial Kart.

Исходный код Trivial Kart можно найти в репозитории games-samples на Github.

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

Настройки проекта > Настройки проигрывателя > Оптимизированный темп кадров
Рисунок 5. Device Simulator поддерживает изменение устройств в редакторе, что позволяет выявлять проблемы дизайна на ранних стадиях.
Настройки проекта > Настройки проигрывателя > Оптимизированный темп славы
Рисунок 6. Установите флажок «Включить предварительные пакеты» перед загрузкой пакета Device Simulator.

Дополнительные сведения о методах оптимизации пользовательского интерфейса для Unity см. в следующем руководстве от Unity: Оптимизация пользовательского интерфейса Unity .

Физика

Движок Nvidia PhysX встроен в Unity. Настройки по умолчанию могут быть ресурсоёмкими на мобильных устройствах, поэтому имейте в виду следующее:

  • Учитывайте целевую частоту кадров и задайте соответствующий фиксированный временной шаг. Значение по умолчанию — 0,02 мс или 50 Гц. Вы можете увеличить его до 0,03 или выше для достижения целевой частоты 30 кадров в секунду.
  • Рассмотрите возможность упрощения коллайдеров сеток и минимизации матрицы столкновений слоев для определения взаимодействий между игровыми объектами определенных типов слоев.

Информацию о настройках физики и оптимизации для мобильных игр можно найти в электронной книге «Оптимизация мобильных игр» от Unity.

Профиль

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

  • Определите ключевые моменты в процессе разработки, на которые можно выделить время для профилирования, а не распределять его случайным образом.
  • Сохраняйте снимки профиля для использования с Unity Profile Analyzer .
  • Профилируйте свою игру на целевых устройствах, чтобы получить точную картину того, как она работает на текущем этапе разработки.
  • Опишите различные части вашей игры.
  • Составляйте профиль того, как ваши игроки играют в игру. (Не составляйте профиль игры только тогда, когда она находится в состоянии ожидания или на экране паузы.)
  • Выполните профилирование в устойчивом режиме после того, как игра будет запущена в течение некоторого времени, чтобы выявить проблемы с регулированием, с которыми вы можете столкнуться, когда мобильные устройства перегреваются .

Вы можете использовать следующие инструменты профилирования по отдельности или в комбинации.

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

  • Android GPU Inspector. С помощью Android GPU Inspector ( AGI ) вы можете выполнять отладку на уровне кадров. AGI также анализирует системные службы, включая графический процессор, центральный процессор, память, батарею и счётчики графического процессора.

Подробную информацию о профилировании игры в Unity можно найти в видеоролике «Введение в профилирование в Unity» или в руководстве « Полное руководство по профилированию игр Unity» — оба руководства от Unity.

Управление памятью

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

При работе со скриптами на C# будьте осторожны с использованием строк, сравнением строк и выделением памяти для объектов, связанных со строками (например, JSON-файлов для настроек игры). Это приводит к частому выделению памяти и может способствовать фрагментации.

Рассмотрите возможность использования класса StringBuilder для больших последовательностей операций со строками вместо конкатенации строк на месте (например, «this» + «is» + «a» + «bad» + «idea» вместо вызовов функции 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 .

Объединение сборных конструкций

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

В Unity Asset Store вы найдете множество сторонних ресурсов для управления пулингом игровых объектов. Вы также можете создать свои собственные. См. раздел «Введение в пулинг объектов» на Unity Learn .

Доставка активов

Размер вашего приложения при первом размещении в Google Play ограничен. В зависимости от размера и характера вашей игры вам могут потребоваться некоторые или все игровые ресурсы (модели персонажей, окружение, элементы пользовательского интерфейса и т. д.), чтобы игроки получили желаемый игровой опыт.

Вы можете использовать сервис Play Asset Delivery (PAD) для управления ресурсами, которые требуются вашей игре при установке, быстром доступе или по запросу. Пакеты ресурсов Unity интегрированы для поддержки PAD, и вы можете использовать этот инструмент, чтобы указать, какие элементы должны быть доставлены.

Адреса

Настройка динамических ресурсов, таких как префабы, текстуры и звуковые файлы, во время выполнения больше не будет сложной операцией, если вы подготовите и изучите систему имён Addressables. Адресуемые ресурсы позволяют отделить порядок организации контента от способа его создания и загрузки. Система Addressables заменяет папки ресурсов и пакеты ресурсов, упрощая ссылки на ресурсы и их загрузку во время выполнения.

Пример см. в демонстрационном проекте с использованием пакета Addressables на GitHub. Подробную информацию о разработке Addressables см. в разделе «Addressable Asset System» в блоге Unity .

При использовании адресной разметки ресурсов объединение слишком большого или слишком малого количества ресурсов в общие пакеты имеет свои преимущества и недостатки. Подробнее об управлении контентом с помощью адресной разметки см. в статье « Упростите управление контентом с помощью адресной разметки» .

Вы можете настроить автономную демонстрационную версию и поэкспериментировать с режимами доступа, чтобы освоиться с системой Addressables. Вы также можете ознакомиться с проектом с открытым исходным кодом BuildLayout Explorer для Unity 2019.3 и более поздних версий , а также изучить отчёт buildlayout.txt , созданный Addressables.

Ресурсы для Chop Chop, открытого проекта Unity, были упакованы с использованием системы Addressables для всех операций загрузки и выгрузки. Подробное описание структуры и настройки пакетов Addressables см. в разделе Упаковка контента с помощью адресных ресурсов | Дневник разработки открытых проектов.

В проекте Chop Chop единственная сцена, загруженная по умолчанию, сцена инициализации, была настроена на использование AssetReferences вместо прямых ссылок на активы в проекте (сцены, префабы и т. д.).

Исходный код Unity Open Project: Chop Chop доступен на GitHub. Хотя проект больше не находится в разработке, Git-репозиторий и документация по-прежнему доступны.

Сторонние плагины

Если вы используете сторонние плагины, например, из Unity Asset Store, обязательно проверьте папки и удалите ненужные ресурсы из папок Resources . В процессе сборки Unity собирает все ресурсы, включённые в папки Resources , и упаковывает их в единый пакет, доступный во время выполнения. Это может привести к раздуванию финального пакета и часто не является необходимым.

Чтобы быстро найти все папки с ресурсами, найдите раздел «Ресурсы» на панели «Проект» . Затем выберите каждую папку, чтобы узнать её содержимое и определить, нужна ли она для вашей игры.

Рисунок 7. В папках, загруженных из Unity Asset Store, может быть несколько папок Resources . Очистите их, чтобы они не попали в пакет вашего приложения.

Публиковать и поддерживать

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

Анализ отзывов о выпуске ограниченной версии

Вы можете запустить игру для ограниченной целевой аудитории и провести масштабное бета-тестирование, либо активировать её для полной доступности на всех рынках. Ограниченный релиз позволит вам оптимизировать производительность приложения с учётом более широкой аудитории и количества устройств.

Например, вы можете использовать Android Performance Tuner для Unity и Google Analytics для Unity , чтобы получать информацию о производительности вашего приложения и тенденциях игроков, на основе которой ваша команда разработчиков сможет оптимизировать игру и выпускать обновления. Вы также можете использовать данные аналитики для планирования сиквелов или похожих игр в схожем жанре.

Альфа и бета-тестирование

После настройки профиля приложения в Google Play Console вы можете подготовить публичные альфа- и бета-тестовые сборки и распространить их среди ограниченной аудитории для предварительного ознакомления. Запуск для ограниченной аудитории позволит вам устранить все возможные проблемы на большем количестве устройств и собрать первые отзывы, на которые вы сможете отреагировать перед глобальным релизом.

Ваши сборки Unity распространяются через Android App Bundles. Подробнее см. в руководстве «Доставка в Google Play из Unity», где также описаны изменения формата APK-файлов в AAB.

Мониторинг и отслеживание

На этапе запуска и распространения вашей игры вы можете использовать Android Vitals для отслеживания проблем с производительностью на устройствах, к которым у вас мог не быть доступа во время разработки и тестирования. Подробнее смотрите в разделе «Что нового для игр в Reach and devices» и «Android Vitals» .

Крупные команды разработчиков часто используют уникальные и специализированные конвейеры игровой телеметрии, предоставляющие метрики, связанные с производительностью устройства. Не забудьте воспользоваться Android Performance Tuner (APT) и соответствующим плагином Unity для сбора метрик, связанных с частотой кадров, качеством графики, временем загрузки и количеством прерванных загрузок. Следуйте пошаговому руководству в статье «Интеграция Android Performance Tuner в игру на Unity» .

Жизненный цикл вашей игры не заканчивается после её запуска. Мониторинг, поддержание производительности и реагирование на отзывы критически важны для довольных пользователей, положительных отзывов и окончательного принятия вашей игры на всех рынках.