版本: Unity 6 (6000.0)
语言英语
  • C#

SettingsProvider

UnityEditor 中的类

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实会阅读用户提出的每项更改建议,并在适用时进行更新。

关闭

提交失败

由于某些原因,您的更改建议无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

描述

SettingsProvider 是配置类,用于指定项目设置或首选项应如何在“设置”或“首选项”窗口中显示。

为了添加新的项目设置或首选项页面,请定义 SettingsProvider。SettingsProvider 类提供挂钩以显示任何 UI(使用 IMGUI 或 UIElements 绘制)。它还提供了一个 API,允许您指定在“设置”和“首选项”窗口中以两种方式使用的关键字

1) 搜索栏过滤掉没有匹配关键字的 SettingsProvider。

2) 属性标签以匹配的关键字突出显示。

此示例演示创建和配置不同 SettingsProvider 的多种方法

using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEditor.UIElements;

// Create a new type of Settings Asset. class MyCustomSettings : ScriptableObject { public const string k_MyCustomSettingsPath = "Assets/Editor/MyCustomSettings.asset";

[SerializeField] private int m_Number;

[SerializeField] private string m_SomeString;

internal static MyCustomSettings GetOrCreateSettings() { var settings = AssetDatabase.LoadAssetAtPath<MyCustomSettings>(k_MyCustomSettingsPath); if (settings == null) { settings = ScriptableObject.CreateInstance<MyCustomSettings>(); settings.m_Number = 42; settings.m_SomeString = "The answer to the universe"; AssetDatabase.CreateAsset(settings, k_MyCustomSettingsPath); AssetDatabase.SaveAssets(); } return settings; }

internal static SerializedObject GetSerializedSettings() { return new SerializedObject(GetOrCreateSettings()); } }

// Register a SettingsProvider using IMGUI for the drawing framework: static class MyCustomSettingsIMGUIRegister { [SettingsProvider] public static SettingsProvider CreateMyCustomSettingsProvider() { // First parameter is the path in the Settings window. // Second parameter is the scope of this setting: it only appears in the Project Settings window. var provider = new SettingsProvider("Project/MyCustomIMGUISettings", SettingsScope.Project) { // By default the last token of the path is used as display name if no label is provided. label = "Custom IMGUI", // Create the SettingsProvider and initialize its drawing (IMGUI) function in place: guiHandler = (searchContext) => { var settings = MyCustomSettings.GetSerializedSettings(); EditorGUILayout.PropertyField(settings.FindProperty("m_Number"), new GUIContent("My Number")); EditorGUILayout.PropertyField(settings.FindProperty("m_SomeString"), new GUIContent("My String")); settings.ApplyModifiedPropertiesWithoutUndo(); },

// Populate the search keywords to enable smart search filtering and label highlighting: keywords = new HashSet<string>(new[] { "Number", "Some String" }) };

return provider; } }

// Register a SettingsProvider using UIElements for the drawing framework: static class MyCustomSettingsUIElementsRegister { [SettingsProvider] public static SettingsProvider CreateMyCustomSettingsProvider() { // First parameter is the path in the Settings window. // Second parameter is the scope of this setting: it only appears in the Settings window for the Project scope. var provider = new SettingsProvider("Project/MyCustomUIElementsSettings", SettingsScope.Project) { label = "Custom UI Elements", // activateHandler is called when the user clicks on the Settings item in the Settings window. activateHandler = (searchContext, rootElement) => { var settings = MyCustomSettings.GetSerializedSettings();

// rootElement is a VisualElement. If you add any children to it, the OnGUI function // isn't called because the SettingsProvider uses the UIElements drawing framework. var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Editor/settings_ui.uss"); rootElement.styleSheets.Add(styleSheet); var title = new Label() { text = "Custom UI Elements" }; title.AddToClassList("title"); rootElement.Add(title);

var properties = new VisualElement() { style = { flexDirection = FlexDirection.Column } }; properties.AddToClassList("property-list"); rootElement.Add(properties);

properties.Add(new PropertyField(settings.FindProperty("m_SomeString"))); properties.Add(new PropertyField(settings.FindProperty("m_Number")));

rootElement.Bind(settings); },

// Populate the search keywords to enable smart search filtering and label highlighting: keywords = new HashSet<string>(new[] { "Number", "Some String" }) };

return provider; } }

// Create MyCustomSettingsProvider by deriving from SettingsProvider: class MyCustomSettingsProvider : SettingsProvider { private SerializedObject m_CustomSettings;

class Styles { public static GUIContent number = new GUIContent("My Number"); public static GUIContent someString = new GUIContent("Some string"); }

const string k_MyCustomSettingsPath = "Assets/Editor/MyCustomSettings.asset"; public MyCustomSettingsProvider(string path, SettingsScope scope = SettingsScope.User) : base(path, scope) {}

public static bool IsSettingsAvailable() { return File.Exists(k_MyCustomSettingsPath); }

public override void OnActivate(string searchContext, VisualElement rootElement) { // This function is called when the user clicks on the MyCustom element in the Settings window. m_CustomSettings = MyCustomSettings.GetSerializedSettings(); }

public override void OnGUI(string searchContext) { // Use IMGUI to display UI: EditorGUILayout.PropertyField(m_CustomSettings.FindProperty("m_Number"), Styles.number); EditorGUILayout.PropertyField(m_CustomSettings.FindProperty("m_SomeString"), Styles.someString); m_CustomSettings.ApplyModifiedPropertiesWithoutUndo(); }

// Register the SettingsProvider [SettingsProvider] public static SettingsProvider CreateMyCustomSettingsProvider() { if (IsSettingsAvailable()) { var provider = new MyCustomSettingsProvider("Project/MyCustomSettingsProvider", SettingsScope.Project);

// Automatically extract all keywords from the Styles. provider.keywords = GetSearchKeywordsFromGUIContentProperties<Styles>(); return provider; }

// Settings Asset doesn't exist yet; no need to display anything in the Settings window. return null; } }

属性

activateHandler覆盖 SettingsProvider.OnActivate。
deactivateHandler覆盖 SettingsProvider.OnDeactivate。
footerBarGuiHandler覆盖 SettingsProvider.OnFooterBarGUI。
guiHandler覆盖 SettingsProvider.OnGUI。
hasSearchInterestHandler覆盖 SettingsProvider.HasSearchInterest。
inspectorUpdateHandler覆盖 SettingsProvider.OnInspectorUpdate。
keywords获取或设置要与用户搜索内容进行比较的关键字列表。当用户在“设置”窗口的搜索框中输入值时,SettingsProvider.HasSearchInterest 会尝试将这些关键字与该列表进行匹配。
label获取或设置 SettingsProvider 在“设置”窗口中显示的名称。如果未设置,则“设置”窗口使用 SettingsProvider.settingsPath 的最后一个标记。
scope获取 SettingsProvider 的作用域。作用域确定 SettingsProvider 是显示在“首选项”窗口(SettingsScope.User)中还是“设置”窗口(SettingsScope.Project)中。
settingsPath获取用于在“设置”窗口的树形视图中放置 SettingsProvider 的路径。该路径在所有其他设置路径中应唯一,并应使用“/”作为其分隔符。
titleBarGuiHandler覆盖 SettingsProvider.OnTitleBarGUI。

构造函数

SettingsProvider创建一个新的 SettingsProvider。

公共方法

HasSearchInterest检查当用户在“设置”窗口搜索框中键入内容时,SettingsProvider 是否应显示。SettingsProvider 会尝试将搜索词(即使是部分词)与任何 SettingsProvider.keywords 进行匹配。搜索不区分大小写。
OnActivate使用此函数实现用户在“设置”窗口中单击设置时的处理程序。您可以从此函数获取设置资源或设置 UIElements UI。
OnDeactivate使用此函数实现用户单击其他设置或“设置”窗口关闭时的处理程序。
OnFooterBarGUI使用此函数覆盖使用 IMGUI 绘制 SettingsProvider 页脚。
OnGUI使用此函数根据 IMGUI 绘制 UI。这假设您没有向传递给 OnActivate 函数的 rootElement 添加任何子元素。
OnInspectorUpdate每秒调用 OnInspectorUpdate 10 次,以便检查器有机会更新。有关更多详细信息,请参阅 EditorWindow.OnInspectorUpdate。
OnTitleBarGUI使用此函数覆盖使用 IMGUI 绘制 SettingsProvider 标题。这允许您在标题旁边添加自定义 UI(例如工具栏按钮)。AssetSettingsProvider 使用此机制显示“添加到预设”和“帮助”按钮。
Repaint请求 SettingsWindow 重绘。

静态方法

GetSearchKeywordsFromGUIContentProperties从特定类型中的所有公共静态成员提取搜索关键字。
GetSearchKeywordsFromPath从特定路径下资源的序列化属性中提取搜索关键字。
GetSearchKeywordsFromSerializedObject从 SerializedObject 的序列化属性中提取搜索关键字。