Создание настраиваемых масштаберов
Создайте настраиваемые масштаберы для автоматической настройки параметров качества на основе производительности устройства.
Пользовательские масштаберы позволяют расширить систему адаптивной производительности собственной логикой для управления параметрами качества. Дополнительные сведения о масштаберах см. в разделе Изменение качества ассета с помощью масштаберов.
Существует два способа создания настраиваемых масштаберов:
Выбранный метод определяет способ настройки масштабера и его применения во время выполнения.
Важно: Эти два рабочих процесса взаимно исключают друг друга. Если вы добавили собственный масштабировщик через интерфейс редактора, Unity отключает автоматический поиск масштабировщиков, объявленных только в скриптах. Выберите для проекта один способ.
Добавление пользовательского масштабировщика через интерфейс редактора
Создать ScriptableObject ассет из вашего скрипт Scaler для настройки свойств Scaler непосредственно в Редакторе для каждого профиль скалера.
Чтобы добавить настраиваемый масштабируемый объект в Редакторе, необходимо создать скрипт настраиваемого масштабируемых объектов и добавить ассет масштабируемых объектов в профиль масштабируемых объектов.
Создание настраиваемого скрипта масштабирования
Чтобы создать скрипт:
- Создайте новый скрипт C#, который наследует от
AdaptivePerformanceScaler. - Добавить
CreateAssetMenuатрибут к классу. Так скрипт становится доступен в Ассеты > Создать меню. - Определите поведение масштабера с помощью методов переопределения, таких как
OnLevel,OnEnabledиOnDisabled.
Добавление ассета масштабирования в профиль масштабирования
Чтобы добавить и настроить ресурс:
- В Редакторе, из главного меню, перейдите в Ассеты > Создать и выберите пункт меню, который вы определили в атрибуте
CreateAssetMenu. Это создаст новый файл scaler asset в вашем окне Project. - Перейдите в Изменить > Project Настройки > Адаптивная производительность.
- Выберите профиль масштабирования.
- Добавить ресурс в список настраиваемых масштабировщиков.
- Настройка параметров масштабирования непосредственно в редакторе. Примечание: настройки, заданные в скрипте, переопределяют настройки, сконфигурированные в редакторе. Поэтому рекомендуется задавать поведение масштабировщика в скрипте, а все настройки — в редакторе.
После выполнения этих действий в окне Project появится ассет Scaler, который можно добавить в любой профиль Scaler и настроить независимо.
После добавления ассета следует обратить внимание на следующее поведение:
- Адаптивная производительность создает клон ассета масштабирования и управляет им внутри профиля. Если вы измените исходный файл ассета в окне Project, для того чтобы изменения вступили в силу, необходимо удалить старый масштабируемый ассет из профиля и снова добавить обновленный ассет.
- Имя масштабера в списке заимствовано из имени файла ассета. Нельзя добавить несколько масштаберов с одинаковым именем в один профиль.
Пример: масштабер на основе UI
Этот пример показывает скрипт для рабочего процесса через интерфейс редактора. Все настройки задаются в редакторе.
using UnityEngine;
using UnityEngine.AdaptivePerformance;
// This attribute allows you to create an asset from this script
// via Assets > Create > Scriptable Objects > Texture Quality Scaler UI.
[CreateAssetMenu(fileName = "TextureQualityScaler_UI", menuName = "Scriptable Objects/Texture Quality Scaler UI")]
public class TextureQualityScalerUI : AdaptivePerformanceScaler
{
private int m_DefaultTextureLimit;
protected override void OnEnabled()
{
// Store the original texture quality setting when the scaler is enabled.
m_DefaultTextureLimit = QualitySettings.globalTextureMipmapLimit;
}
protected override void OnDisabled()
{
// Restore the original setting when the scaler is disabled.
m_DefaultTextureLimit = QualitySettings.globalTextureMipmapLimit;
}
// This method is called when the performance level changes.
protected override void OnLevel()
{
// The base class calculates the new `Scale` value based on the current performance level.
// Apply the new scale to the global mipmap limit.
// A higher scale (better quality) maps to a lower mipmap limit (better quality).
if (ScaleChanged())
{
// Adjust the global texture mipmap limit based on the new scale.
Debug.Log($"TextureQualityScalerUI new scale: {Scale}");
QualitySettings.globalTextureMipmapLimit = (int)MaxBound - ((int)(MaxBound * Scale));
}
}
}
Создание масштабера только с помощью скрипта
В этом рабочем процессе вы определяете настройки масштабера непосредственно в скрипте. Во время выполнения Unity сканирует ваш проект на наличие скриптов, наследующих от AdaptivePerformanceScaler, и добавляет их автоматически. Настройки, определенные в скрипте, применяются глобально ко всем профилям масштабера.
Чтобы создать настраиваемый масштабер только для скриптов:
- Создайте новый скрипт C#, который наследует от
AdaptivePerformanceScaler. - Убедитесь, что имя класса совпадает с
AdaptivePerformanceScalerSettingsBaseимя. - Определить поведение масштабера.
Выполнив эти шаги, вы получите в проекте скрипт собственного масштабировщика. При входе в режим Play система Adaptive Performance автоматически обнаружит и применит его — при условии, что вы не добавляли масштабировщиков через интерфейс редактора.
Пример: Скаллирующий инструмент только для скриптов
Этот пример включает все параметры, определенные в сценарии.
using UnityEngine;
using UnityEngine.AdaptivePerformance;
public class TextureQualityScalerScriptOnly : AdaptivePerformanceScaler
{
// Define the default settings for the scaler.
private AdaptivePerformanceScalerSettingsBase m_AdaptiveTextureQualityScaler = new AdaptivePerformanceScalerSettingsBase
{
// This name must exactly match the class name.
name = "TextureQualityScalerScriptOnly",
enabled = false,
scale = 1.0f,
visualImpact = ScalerVisualImpact.High,
target = ScalerTarget.GPU,
minBound = 0,
maxBound = 4,
maxLevel = 4
};
private int m_DefaultTextureLimit;
protected override void Awake()
{
base.Awake();
// Apply the default settings defined above.
ApplyDefaultSetting(m_AdaptiveTextureQualityScaler);
}
protected override void OnEnabled()
{
m_DefaultTextureLimit = QualitySettings.globalTextureMipmapLimit;
}
protected override void OnDisabled()
{
QualitySettings.globalTextureMipmapLimit = m_DefaultTextureLimit;
}
protected override void OnLevel()
{
if (ScaleChanged())
{
Debug.Log($"TextureQualityScalerScriptOnly new scale: {Scale}");
QualitySettings.globalTextureMipmapLimit = (int)MaxBound - ((int)(MaxBound * Scale));
}
}
}