Как настроить юнити под себя

Настройки Качества

Unity позволяет вам установить уровень качества графики, на котором будет производится попытка рендеринга. В общем случае, высокое качество снижает частоту кадров, таким образом, иногда лучше не устанавливать наивысший уровень качества на мобильных устройствах или старом оборудовании, так как это будет отрицательно влиять на игровой процесс. Инспектор Quality Settings (в меню: Edit->Project Settings->Quality ) используется для установки уровня качества для выбранных устройств в редакторе. Он разделен на две основные области: в верхней расположена следующая матрица:

Для быстрой ориентации в настройках качества, Unity позволяет вам назначать своим комбинациям настроек уникальные имена. Строки матрицы позволяют вам настроить какой уровень качества будет применён для той или иной платформы. Самая нижняя строчка матрицы не является уровнем качества как таковым, но она позволяет задать стандартный уровень качества для всех платформ (зелёный чекбокс в колонке отвечает за уровень выбранного качества для выбранной платформы). По-умолчанию вместе с Unity идёт 6 предустановленных наборов уровня качества, но вы также можете настраивать и сохранять свои наборы, используя кнопку, расположенную под матрицей. Чтобы удалить ненужный набор, можно воспользоваться значком корзины (расположенном в самой правой колонке).

Для редактирования уровня детализации, можете нажать на его названии под панелью настроек матрицы:

Параметры качества, которые вы можете установить для определенного уровня качества, следующие:

Свойство: Функция:
Имя Имя, которое будет присвоено этому уровню качества.
Визуализация
Pixel Light Count Максимальное значение пиксельных источников света используемых при упреждающем рендеринге (Forward Rendering).
Texture Quality Позволяет вам выбрать, отображать ли текстуры в высоком разрешении или в среднем (низкое разрешение требует незначительного количества ресурсов). Варианты настроек следующие Full Res, Half Res, Quarter Res и Eighth Res.
Анизотропные текстуры не используются. This enables if and how anisotropic textures will be used. The options are Disabled, Per Texture and Forced On (ie, always enabled).
###Сглаживание Устанавливает уровень применяемого сглаживания. Варианты настроек следующие 2x, 4x and 8x мульти-сэмплинг.
###Мягкие Частицы Должно ли для частиц использоваться мягкое смешивание?
Realtime Reflection Probes Should reflection probes be updated during gameplay?
Shadows
Shadows This determines which type of shadows should be used. The available options are Hard and Soft Shadows, Hard Shadows Only and Disable Shadows.
Shadow resolution Тени могут быть отрендерены в нескольких разрешениях: Low, Medium, High и Very High. Чем выше разрешение, тем больше будет выполнено вычислений.
Shadow Projection Существует два метода для проецирования теней из направленных источников света. Плотное прилегание (Close Fit) рендерит тени высокого разрешения, но время от времени при движении камеры они могут слегка колебаться. Стабильное прилегание (Stable Fit) рендерит тени низкого разрешения, но они не колеблются при движении камеры.
Shadow Cascades Количество потоков теней может быть равно нулю, двум или четырём. Большее количество потоков означает и лучшее качество создаваемых теней, но также это и большее количество вычислений (для получения дальнейшей информации, просмотрите страницу Направленные тени (Directional Shadows)).
Shadow Distance Максимальное расстояние от камеры на котором тени будут видны. Тени расположенные дальше рендериться не будут.
Shadow Near Plane Offset Offset shadow near plane to account for large triangles being distorted by shadow pancaking.
Other
Blend Weights Количество костей, которые могут влиять на отдельно взятую вершину в процессе анимации. Доступными значениями являются: одна, две или четыре кости.
VSync Count Рендеринг может быть синхронизирован с частотой обновлений устройства вывода (монитора) с целью избежания артефактов “разрывов” (смотрите ниже). Вы можете выбрать синхронизацию с каждой вертикальной пустотой (VBlank), с каждой второй вертикальной пустотой или же вовсе отключить синхронизацию.
LOD Bias Уровень LOD выбирается исходя из размера объекта, занимаемого им на экране. Когда размер находится между двумя уровнями LOD, выбор может быть сделан как в сторону более детализированной, менее детализированной модели, так и в сторону более детализированной из двух имеющихся моделей. Значение может изменяться от 0 до 1 — чем ближе значение к 0, тем более вероятно что будет использоваться менее детализированная модель.
##Максимальный уровень LOD Наибольший LOD, который будет использоваться в игре. Для получения дополнительной информации ознакомьтесь с примечанием ниже.
Particle Raycast Budget Максимальное количество излучаемых лучей, используемых для аппроксимации столкновений систем частиц (те с качеством Medium или Low ). Просмотрите модуль столкновений системы частиц.
Async Upload Time Slice The amount of CPU time in milliseconds per frame to spend uploading buffered textures to the GPU. See Async Texture Upload.
Async Upload Buffer Size The size in MB for the Async Upload buffer. See Async Texture Upload.

Максимальный уровень LOD

Модели, которые будут иметь уровень детализации ниже максимального уровня (MaximumLOD) не будут использоваться, а также будут опущены при сборке (что позволит сохранить место в памяти). Unity будет использовать для настроек целевой платформы усреднённое значение LOD объектов, взятое из всех максимальных LOD, которые присутствуют в сцене. Если LOD был включён в группу, тогда независимо от используемой настройки качества, модели из этой группы будут включены в сборку и будут всегда загружаться при исполнении для этой LOD группы. В качестве примера, если в любой настройке будет использоваться уровень LOD 0, тогда в сборку будут включены все уровни LOD и использующие их объекты.

Разрыв кадра

Изображение на дисплее устройства обновляется не постоянно, а через некоторый постоянный интервал времени, подобно тому как происходит обновление кадра в Unity. Тем не менее, обновления Unity не обязательно синхронизированы с таковыми дисплея, таким образом, может возникнуть ситуация, когда Unity отправил на дисплей новый кадр, пока предыдущий все еще рендерится. Это приводит к визуальному артефакту, называемому “разрывом кадра” в том месте экрана, где произошла смена кадра.

Симуляция примера разрыва кадра. Смещение картинки отчетливо заметно на увеличенном фрагменте.

Unity можно настроить на переключение кадров лишь в том промежутке времени, когда устройство вывода изображения (монитор) не обновляется, в момент так называемой “вертикальной пустоты” (“vertical blank”). Опция VSync настроек качества (Quality Settings) синхронизирует переключение кадров с вертикальной пустотой устройства или опционально с любой другой вертикальной пустотой. Последнее будет полезно, если игре для рендеринга одного кадра может потребоваться более одного устройства.

Сглаживание

Сглаживание (анти алиасинг) улучшает отображение граней полигонов, путём сглаживания их “зазубренности”. Однако это выливается в нагрузке на видеокарту и использование большего количества её памяти (нагрузка на центральный процессор отсутствует). Уровень сглаживания подразумевает то, насколько сглажены грани полигонов (и сколько это требует памяти).

Без сглаживания, ребра полигона выглядят “зубчатыми”. с 6-ти кратным сглаживанием, рёбра полигона будут сглажены.

However, built-in hardware anti-aliasing does not work with Deferred Shading or HDR rendering; for these cases you’ll need to use Antialiasing Image Effect.

Мягкие Частицы

Мягкие частицы исчезают в местах пересечения с геометрией сцены. Выглядит это конечно весьма привлекательно, однако требует для себя больше вычислительных ресурсов (более комплексные пиксельные шейдеры), и работает только на платформах, поддерживающих (текстуры глубины (depth textures))(SL-DepthTextures). Более того, вам нужно использовать проход рендеринга под названиемотложенное освещение, или произвести из скрипта камерный рендеринг текстур глубины.

Без использования мягких частиц — видимое пересечение с объектами сцены. C использованием мягких частиц — пересечение плавно затухает.

Источник

Просто о внутренних и внешних настройках для приложения в Unity3D

Введение

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

По традиции начну с предыстории. За время работы в игровой индустрии я разрабатывал различные проекты, с разной сложностью и побывал и в лагере гейм-дизайна, и в лагере программистов (где нахожусь и по сей день). Ни для кого не секрет, что любое приложение требует большого числа различных конфигурационных данных и настроек. В классическом, относительно Unity3d виде, такие настройки выносятся в видимую часть инспектора, где вводятся какие-то цифры и т.п. Я думаю, что говорить об удобстве такого подхода не стоит, это даже если исключить, факт, того, что на время настройки, сцена, в которой находится MonoBehaviour класс блокируется для изменений другими разработчиками. Поэтому после череды разного рода мытарств в прошлом, я решил, написать что-то простое и эффективное, что облегчит всем жизнь и упростит работу с такими данными, чем и хочу поделиться с вами.

Примечание: весь описанный ниже код применим к версии Unity 2018.3+ и использует компилятор Roslyn (версия языка C# 7+).

Внутренние настройки

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

  • String
  • Int
  • Float
  • Bool

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

Итак, в базе, мы имеем массив значений, представляющих из себя:

  • Имя параметра
  • Тип параметра
  • Значения параметра в виде строки

Примечание: почему строки? Мне показалось это более удобным, чем хранить 4 переменные разных типов.

Инициализация выполняется в OnEnable. Почему не в Awake? Этот метод не вызывается для экземпляров, хранимых как ассет (вызывается он в момент CreateInstance, что нам не нужно). В момент запуска приложения для ассетов ScriptableObject вызывается сначала OnDisable (только в редакторе), затем OnEnable. Также, чтобы в редакторе при каждой перекомпиляции и открытии проекта не срабатывала инициализация, нужно добавить директивы предкомпиляции, а в начале файла вставить:

Метод GetValue понадобиться нам далее, а для внутренних настроек, он просто возвращает значение по умолчанию.

Метод GetParameterValue наш основной метод для доступа к параметрам. Здесь стоит учесть, что несмотря на unboxing значений, параметры хранимые в Setting это в некоем роде константы, поэтому их следует забирать при инициализации сцен. Не стоит вызывать метод в Update.

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

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

Вот так это будет выглядеть:

Пояснять код сильно не буду, здесь в целом все просто. Отмечу только, что редактор позволяет редактировать по выбору все ассеты типа Setting. Для этого при открытии окна мы находим их в проекте с помощью метода AssetDatabase.FindAssets(«t:<0>».Fmt(typeof(Setting).Name)). А также редактирование имени параметра сделано через кнопку для того, чтобы исключить его случайное изменение.

Вот так выглядит редактор:

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

Внешние настройки

Представим себе ситуацию, что в уже запущенной игре, нам вдруг понадобилось изменить некие значения, чтобы скорректировать игровой процесс. В примитивном варианте, мы это изменяем в билде, накапливаем такие изменения, делаем обновление и отправляем в магазины, после чего ждем подтверждения и т.п. Но как бы с теми, кто не обновит приложение? И что, если изменения нужно внести срочно? Для решения этой задачи существует такой механизм как Remote Settings. Это не новое изобретение и используется во многих сторонних SDK для аналитики и т.п., например — это есть в Firebase, в GameAnalytics, а также в Unity Analytics. Именно последнее мы и будем использовать.

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

Остановимся подробнее на том, что же такое Remote Settings в Unity Analytics и что он умеет.

Для того, чтобы данный функционал стал доступен в проекте, необходим включить аналитику в проекте на вкладке Services.

После этого необходимо зайти в свой аккаунт Unity3d и найти там свой проект и перейти по ссылке в раздел аналитики, где слева в меню выбираем пункт Remote Settings.

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

Для добавления параметра выбираем соответствующий пункт и вводим имя, тип и значение параметра.

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

Примечание: кнопка Sync осуществляет синхронизацию параметров с приложением. Этот процесс не происходит мгновенно, однако в момент, когда параметры в приложении обновятся, будут вызваны соответствующие события, о них мы поговорим позже.

Для работы с Remote Settings не требуется каких-либо дополнительных SDK, достаточно включить аналитику, о чем я писал выше.

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

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

Менеджер представлен в виде сиглетона, который живет только в сцене. Это сделано для простоты обращения к нему и для того, чтобы можно было легко управлять набором параметров в каждой сцене (исключить параметры, которые не требуются по логике).

Как видно у RemoteSettings есть три события:

  1. Событие, вызываемое перед тем, как будут получены значения параметров с удаленного сервера
  2. Событие обновления параметров (вызывается как раз по кнопке Sync, о которой мы писали ранее), а также в случае принудительного обновления параметров через функцию ForceUpdate
  3. Событие вызываемое, когда с сервера будут получены данные о удаленных настройках. Здесь также выдается код ответа сервера, в случае если произойдет какая-либо ошибка.

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

Примечание: необходимо понимать, как работает RemoteSettings. На старте, если есть доступ в интернет, он автоматически скачивает данные о параметрах и кэширует их, поэтому при следующем запуске, если интернет отсутствуют, данные будут взяты из кэша. Исключение составляет ситуация, когда приложение изначально запускается с выключенным доступом в сеть, в этом случае, функции получения значения параметра вернут значение по умолчанию. В нашем случае — это те, которые мы вводим в редакторе.

Изменим теперь пример использования настроек из кода с учетом вышеописанного.

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

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

Заключение

В данной статье я постарался показать, как можно просто конфигурировать приложение написанное на Unity3d используя, как внутренние настройки, так и удаленные. Аналогичный подход я использую в своих проектах, и он доказывает свою эффективность. Нам даже удалось, используя удаленные настройки реализовать свою систему A/B тестирования. Помимо этого, настройки повсеместно применяются для хранения различных констант связанных с SDK, с серверными вещами, а также с настройкой игрового процесса и т.п. Гейм-дизайнер может заранее создать набор параметров и описать как, и для чего, и где они используются, при этом он может настраивать игровой процесс не блокируя сцену. А за счет того, что мы использовали ScriptableObject и храним такие параметры как ассеты, их можно загружать через AssetBundle, что еще более расширяет нам возможности.

Источник

Читайте также:  Baidu wifi hotspot не работает
Оцените статью