SettingsProvider — класс конфигурации, задающий, как настройка проекта или параметр должны отображаться в окне Settings или Preferences.
Чтобы добавить новые страницы настроек проекта или параметров, объявите SettingsProvider. Класс SettingsProvider даёт точки подключения для отображения любого интерфейса (отрисованного через IMGUI или UIElements). Он также предоставляет API, позволяющий задать ключевые слова, которые используются в окнах Settings и Preferences двумя способами:
1) Поисковая строка фильтрует SettingsProviders, которые не имеют соответствующих ключевых слов.
2) Метки свойств выделены соответствующими ключевыми словами.
В этом примере показано, как настроить SettingsProvider с IMGUI:
using UnityEditor;
using UnityEngine;
class MyCustomSettings : ScriptableObject
{
const string AssetPath = "Assets/Editor/MyCustomSettings.asset";
[SerializeField] int m_Number = 42;
[SerializeField] string m_SomeString = "The answer to the universe";
internal static MyCustomSettings GetOrCreate()
{
MyCustomSettings settings = AssetDatabase.LoadAssetAtPath<MyCustomSettings>(AssetPath);
if (settings == null)
{
settings = CreateInstance<MyCustomSettings>();
AssetDatabase.CreateAsset(settings, AssetPath);
AssetDatabase.SaveAssets();
}
return settings;
}
internal static SerializedObject GetSO() => new SerializedObject(GetOrCreate());
}
static class MyCustomSettingsIMGUI
{
[SettingsProvider]
public static SettingsProvider CreateProvider()
{
return new SettingsProvider("Project/My Custom Settings", SettingsScope.Project)
{
label = "My Custom",
guiHandler = _ =>
{
SerializedObject serializedObject = MyCustomSettings.GetSO();
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Number"), new GUIContent("My Number"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_SomeString"), new GUIContent("My String"));
serializedObject.ApplyModifiedPropertiesWithoutUndo();
},
keywords = new System.Collections.Generic.HashSet<string>(new[] { "Number", "String" })
};
}
}
В этом примере показано, как настроить SettingsProvider с UIElements:
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEditor.UIElements;
class MyCustomSettings : ScriptableObject
{
const string AssetPath = "Assets/Editor/MyCustomSettings.asset";
[SerializeField] int m_Number = 42;
[SerializeField] string m_SomeString = "The answer to the universe";
internal static MyCustomSettings GetOrCreate()
{
MyCustomSettings settings = AssetDatabase.LoadAssetAtPath<MyCustomSettings>(AssetPath);
if (settings == null)
{
settings = CreateInstance<MyCustomSettings>();
AssetDatabase.CreateAsset(settings, AssetPath);
AssetDatabase.SaveAssets();
}
return settings;
}
internal static SerializedObject GetSO() => new SerializedObject(GetOrCreate());
}
static class MyCustomSettingsUIToolkit
{
[SettingsProvider]
public static SettingsProvider CreateProvider()
{
return new SettingsProvider("Project/My Custom Settings (UI)", SettingsScope.Project)
{
label = "My Custom (UI)",
activateHandler = (_, root) =>
{
SerializedObject serializedObject = MyCustomSettings.GetSO();
VisualElement container = new VisualElement();
container.style.flexDirection = FlexDirection.Column;
container.Add(new PropertyField(serializedObject.FindProperty("m_SomeString"), "My String"));
container.Add(new PropertyField(serializedObject.FindProperty("m_Number"), "My Number"));
root.Add(container);
root.Bind(serializedObject);
// Optional stylesheet:
// StyleSheet styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Editor/settings_ui.uss");
// if (styleSheet != null) root.styleSheets.Add(styleSheet);
},
keywords = new System.Collections.Generic.HashSet<string>(new[] { "Number", "String" })
};
}
}