- Основы настройки Universal Render Pipeline (URP) в Unity 2019.3
- Масштабируемая и высокая производительность рендеринга
- Разработка мобильных игр на Unity. URP, 2D Animation и другие новомодные вещи на примере игры
- Базовая настройка проекта. URP и все-все-все.
- Игровой фреймворк
- Логика сцен
- Работа с контентом
- Итого
Основы настройки Universal Render Pipeline (URP) в Unity 2019.3
В этом статье вы узнаете, как начать работу с Universal Render Pipeline (далее «URP«) (для Unity 2019.3), который ранее известен как LWRP (Unity 2019.2 и ниже).
URP можно использовать практически на любой крупной платформе и обеспечивает красивую графику и высокую производительность.
Давайте попробуем преобразовать сцену из Unity в URP.
В первую очередь пойти в Windows — Package Manager и отсюда выберите Universal RP.
Нажмите установить, как вы видите этот пакет является проверенным пакетом, что означает, что он может быть использован.
Первое, что вам нужно сделать — щелкните правой кнопкой мыши в иерархии проекта, чтобы создать файл настройки «URP» – Create – Rendering – Universal Render Pipeline – Pipeline Assets (Forward Render), а затем перейти к редактированию настройка проекта ( Edit – Project Settings — Graphics). Автоматически создастся два файла «URP» и «URP_Renderer».
И в разделе Scriptable Render Pipeline Settings выбрать «URP» который мы только что создали, и, как вы уже догадались, он преобразует все на сцене в розовый, потому что шейдеры по умолчанию не поддерживается в URP, но не волнуйтесь, мы исправим за одну минуту.
Чтобы преобразовать материалы перейти «Edit – Render Pipeline – Universal Render Pipeline – Upgrade Project Materials to UniversalRP», нажмите продолжить и вуаля, как вы можете видеть это не преобразовало все материалы отлично. Давайте посмотрим, как мы можем преобразовать другие материалы вручную.
Например, сцена у нас есть в основном из деревьев и травы, которые нам нужно преобразовать, выберите эту траву и перейдите к ней в материалы, как вы можете видеть, что этот материал травы использует пользовательский шейдер, поэтому он не был преобразован.
Но не волнуйтесь, это просто прозрачная текстура травы, чтобы преобразовать этот материал надо изменить шейдер на «Universal Renderpipeline/Lit», далее «Render Face – Both», в Base Map выбрать текстуру для шейдера, включить Alpha Clipping, а Smoothness опустить на 0.
Ландшафт будет розовым, давайте исправим это.
Идем в папку материалов и создадим новый материал, щелкнуть правой кнопкой мыши Create — Material, который подпишу «Terrain», выберу тип шейдера «Universal Render Pipeline/Terrain/Lit» и после этого переместим его на место материала в terrain сцены.
Вы можете видеть, что наша местность снова отлично видна, но есть еще одна проблема, если вы заметили, наши ветви деревьев не отбрасывают тени, а ствол этих деревьев отбрасывает тень, чтобы решить эту проблему снова перейдите к материалу веток деревьев и из типа поверхности выбрать (surface type) прозрачный (transparent) и заменить на непрозрачный (opaque) и выставить Threshold на 0,5.
Если тени нету — перейдите в Directional light и измените Type — Directional, Mode — Mixed, Shadow Type — Hard Shadow, Dias — Use Pipeline Settings. Теперь они отлично отбрасывают тень.
Теперь давайте также добавим некоторые пост эффекты для дальнейшей импровизации сцены, чтобы добавить эффект пост-обработки правой кнопкой мыши Volume и выберите Global Volume, и вы можете увидеть по умолчанию режим.
Установка Mode — Global означает, что весь пост эффект будет применяться ко всей сцене, если вы хотите применить эффект к определенной области, то вы должны выбрать Local.
Далее добавим в Volume с помощью Add Override Bloom, White Balance, Depth Of Field, Shadows Midtones Highlights и Vignette добавляем при желании поиграть с цветами.
И, наконец, перейти к камере для её настройки что бы отобразить в полной мере пост эффекты и URP в сцене и окне пред осмотра игры. Изменим следующие настройки:
- Render Type – Base,
- Field of View – 45,
- Render – Default Render (URP_Render),
- Post Processing – поставить галочку,
- Anti-aliasing – Fast Approximate Anti-aliasing (FXAA).
Также мы создадим три настройки графики для разных по силе устройств. Перейдем в ранее создан файл «UPR», изменим в Quality параметры по своему усмотрению, параметр Render Scale поможет существенно изменить производительность для слабых устройств, в Shadows измените дистанцию теней от 50 до 300 и добавьте каскады для теней что бы снизить нагрузку, остальные параметры можете оставить по умолчанию.
Источник
Масштабируемая и высокая производительность рендеринга
Universal Render Pipeline от Unity стал мощным решением, сочетающим красоту, скорость и производительность, а также поддержку всех целевых платформ Unity.
Universal Render Pipeline — это:
- открытый и гибкий рендеринг, который настраивается с помощью скрипта C#;
- масштабируемость качества графики под характеристики устройства — благодаря ей вы получите максимальное качество на мощных устройствах и оптимизированную производительность на бюджетных.
В Universal Render Pipeline постобработка встроена непосредственно в процесс рендеринга, обеспечивая высокую производительность. Разработчикам доступны такие эффекты, как сглаживание, глубина резкости, размытие в движении, проекция Панини, блеск, искажение линзы, хроматические аберрации, цвето- и тонокоррекция, виньетка, зернистость и 8-битный дизеринг.
Universal Render Pipeline
Упор на производительность
Однопроходный упреждающий рендеринг
Поддержка Shader Graph
Встроенный процесс рендеринга
Универсальность
Поддерживает как упреждающий, так и отложенный рендеринг
От 2D и 3D до AR/VR-проектов: Universal Render Pipeline позволяет не тратить время на доработку проекта для выпуска на новом устройстве.
- Mac и iOS
- Android
- Xbox One
- PlayStation 4
- Nintendo Switch
- Ведущие AR- и VR-платформы
- Windows и UWP
Возможность конфигурации рендеринга в Unity с помощью скриптов на C# позволяет вам:
- оптимизировать производительность для конкретных устройств;
- тонко настраивать процесс рендеринга в соответствии с конкретными требованиями;
- управлять потреблением вычислительных ресурсов.
Universal Render Pipeline проще, чем встроенный процесс рендеринга, но улучшает качество графики. Перевод проекта со встроенного процесса рендеринга на Universal Render Pipeline должен обеспечивать аналогичную или улучшенную производительность. Прочтите статью в нашем блоге, чтобы узнать о том, как Universal Render Pipeline повышает частоту кадров без снижения качества графики.
Вы можете воспользоваться преимуществами готовых технологий уже сегодня. Обновите проекты с помощью средств перехода или создайте новый проект на основе нашего шаблона Universal через Unity Hub.
Источник
Разработка мобильных игр на Unity. URP, 2D Animation и другие новомодные вещи на примере игры
Всем привет! Это снова Илья и сегодня мы поговорим о технической реализации мобильной игры в современных реалиях. Статья не претендует на уникальность, однако в ней вы можете найти для себя что-то полезное. А чтобы рассмотреть разработку на реальном проекте — мы возьмем реализацию нашей игры, которая на днях выходит в Soft-Launch.
Дисклеймер! Код в этой статье не проходил рефакторинг и носит лишь ознакомительный характер, чтобы поделиться идеями. И вообще, в целом, это smellscode.
Итак, запасаемся кофе, открываем Unity и погнали!
Базовая настройка проекта. URP и все-все-все.
Начнем с того, что мы работаем с URP (Universal Render Pipeline). Почему так? Потому что он проще в настройке и обладает более гибким контролем, чем стандартный рендер. Ну и добиться хорошей производительности на тапках исходя из этого — намного проще.
Стоит указать, что ниже пойдет речь о 2D игре. Для 3D игр подходы будут несколько отличаться, как и настройки.
Мы реализовали два уровня графики. Low Level — для деревянных смартфонов и High Level — для флагманов. Уровни графики подключаются при помощи Project Settings.
В нашем проекте стоят следующие настройки (для Quality уровней):
Настройки графики для пресета Low в Project Settings:
На что здесь следует обратить внимание:
Texture Quality — качество текстур. Для High — мы берем полный размер текстур, для Low — Четверть. Можно еще внести Middle пресет с дополнительным уровнем.
Resolution Scaling везде стоит 1 — мы берем это значение из URP Asset.
Все что связано с реалтаймом — отключаем.
Теперь перейдем к настройкам самих URP Asset. На что следует обратить внимание:
Для разных уровней качества можно установить Render Scale — тем самым снижая разрешение для отрисовки. Также незабываем про Dynamic / Static батчинг.
Adaptive Performance
Отличная штука для автоматической подгонки производительности мобильных игр (в частности для Samsung-устройств):
Другие полезные настройки:
Отключите 3D освещение, лайтмапы, тени и все что с этим связано.
Используйте для сборки IL2CPP — ускорьте работу вашего кода.
Используйте Color Space — Linear.
По-возможности подключите multithreaded rendering.
Игровой фреймворк
Едем дальше. URP и другие настройки проекта сделали. Теперь настало время поговорить о нашем ядре проекта. Что оно включает в себя?
Само ядро фреймворка включает в себя:
Игровые менеджеры для управления состояниями игры, аудио, переводов, работы с сетью, аналитикой, рекламными интеграциями и прочим.
Базовые классы для интерфейсов (компоненты, базовые классы View).
Классы для работы с контентом, сетью, шифрованием и др.
Базовые классы для работы с логикой игры.
Базовые классы для персонажей и пр.
Утилитарные классы (Coroutine Provider, Unix Timestamp, Timed Event и пр.)
Зачем нужны менеджеры?
Они нужны нам для того, чтобы из контроллеров управлять состояниями и глобальными функциями (к примеру, аналитикой).
Хотя мы и используем внедрение зависимостей, менеджеры состояний реализованы в качестве синглтонов (атата по рукам, но нам норм) и могут быть (и по их назначению должны быть) инициализированы единожды. А дальше мы просто можем использовать их:
А уже сам менеджер распределяет, в какие системы аналитики, как и зачем мы отправляем эвент.
Базовые классы.
Здесь все просто. Они включают в себя базовую логику для наследования. К примеру, класс BaseView и его интерфейс:
А дальше мы можем использовать его, к примеру таким образом:
Классы для работы с контентом, сетью, шифрованием
Ну здесь все просто и очевидно. Вообще, у нас реализовано несколько классов:
1) Классы шифрования (Base64, MD5, AES и пр.)
2) FileReader — считывающий, записывающий файл, с учетом кодировки, шифрования и других параметров. Также он умеет сразу сериализовать / десериализовать объект в нужном формате и с нужным шифрованием.
3) Network-классы, которые позволяют удобно работать с HTTP-запросами, работать с бандлами / адрессаблс и др.
Классы для шифрования нужны, чтобы работать с сохранениями и передачей данных на сервер в безопасном формате (относительно безопасном, но от школьников уже спасет).
Утилитарные классы
Здесь у нас хранятся полезные штуки, вроде Unix Time конвертера, а также костыли (вроде Coroutine Provider-а).
Unix Time Converter:
Костыль Coroutine-Provider:
Логика сцен
Наша игра — это по своей сути интерактивная история с различными мини-играми (поиск предметов, простенькие бои, крафтинг, найди пару, а также большое количество головоломок).
Каждая сцена — содержит в себе основной Installer, который помимо различных View, подключает логические блоки — своеобразные куски механик:
Эти куски механик последовательно выполняются, отдавая события OnInitialize, OnProgress, OnComplete. Когда последний блок сыграет свой OnComplete — он завершит работу сцены (закончит уровень).
Зачем это сделано?
Мы можем собирать каждую сцену из отдельных механик, как конструктор. Это может быть диалог -> поиск предметов -> катсцена -> поиск предметов -> диалог, или любой другой порядок.
Мы можем сохранять прогресс внутри сцены, привязываясь к определенному блоку.
Блоки механик удобнее изменять, нежели огромный инсталлер с кучей разных контроллеров.
Работа с контентом
При работе с контентом, мы стараемся делать упор на оптимизацию. В игре содержится много UI, скелетные 2D анимации, липсинк и прочее. Вообще, контента достаточно много, не смотря на простоту игры.
Анимации в игре
Самый удобный для нас вариант — оказался из коробки. Мы используем систему для работы с костной анимацией от самой Unity:
Да, можно взять Spine, но у нас нет настолько большого количества анимаций, поэтому вариант от Unity — весьма оптимален.
Упаковка и сжатие
Все, что можно и нужно запихнуть в атласы — мы запихиваем в атласы и сжимаем. Это могут быть элементы UI, иконки и многое другое. Для упаковки атласов — используем стандартный Unity пакер из Package Manager (V1):
Локализация
Вся локализация базируется на JSON. Мы планируем отказаться от этого в ближайшее время, но пока что на время Soft-Launch этого хватает:
Работа с UI
При работе с UI мы разбиваем каждый View под отдельный Canvas. 99% всех анимаций работает на проверенном временем DOTween и отлично оптимизирован.
View инициализируются и обновляются по запросу через эвенты, которые внедряются в Level Installer, либо в отдельных блоках логики.
Что мы используем еще?
Salsa — для липсинка;
2D Lighting — для освещения. В большинстве сцен используется освещение по маске спрайта;
DOTween — для анимаций;
Итого
Работа с механиками получается достаточно гибкой за счет блоков логики. Мы изначально думали взять связку Zenject + UniRX, но решили отказаться от нагромождения большой системы. Да, мы сделали проще, но нам и не нужно всех возможностей этих огромных библиотек.
Источник