版本:Unity 6 (6000.0)
语言:English
创建滑块切换自定义控件
为自定义控件创建自定义样式

创建可绑定的自定义控件

版本: 2023.2+

此示例演示如何在自定义编辑器窗口中创建可绑定的自定义控件。

示例概述

此示例创建一个绑定到双精度数据类型属性的自定义控件。您可以调整此示例以绑定到其他数据类型的属性,例如字符串或整数。

您可以在此 GitHub 存储库 中找到此示例创建的完整文件。

先决条件

本指南适用于熟悉 Unity 编辑器、UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 术语表
工具包和 C# 脚本的开发人员。在开始之前,请熟悉以下内容

创建自定义控件类

创建一个 C# 类来定义自定义控件。

  1. 使用任何模板创建一个 Unity 项目。
  2. 创建一个名为 ExampleField 的文件夹以存储您的文件。
  3. ExampleField 文件夹中,创建一个名为 ExampleField.cs 的 C# 脚本,并将其内容替换为以下内容
using UnityEngine.UIElements;

namespace UIToolkitExamples
{
    // ExampleField inherits from BaseField with the double type. ExampleField's underlying value, then, is a double.
    [UxmlElement]
    public partial class ExampleField : BaseField<double>
    {
        Label m_Input;

        // Default constructor is required for compatibility with UXML factory
        public ExampleField() : this(null)
        {

        }

        // Main constructor accepts label parameter to mimic BaseField constructor.
        // Second argument to base constructor is the input element, the one that displays the value this field is
        // bound to.
        public ExampleField(string label) : base(label, new Label() { })
        {
            // This is the input element instantiated for the base constructor.
            m_Input = this.Q<Label>(className: inputUssClassName);
        }

        // SetValueWithoutNotify needs to be overridden by calling the base version and then making a change to the
        // underlying value be reflected in the input element.
        public override void SetValueWithoutNotify(double newValue)
        {
            base.SetValueWithoutNotify(newValue);

            m_Input.text = value.ToString("N");
        }
    }
}

在 UXML 文件中使用自定义控件

  1. ExampleField 文件夹中,创建一个名为 ExampleField.uxml 的 UI 文档。
  2. 在文本编辑器中打开 ExampleField.uxml,并将其内容替换为以下内容
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:example="UIToolkitExamples">
    <example:ExampleField label="Binding Target" binding-path="m_Value" />
</ui:UXML>

创建绑定目标的类

  1. 在 Unity 中,双击 ExampleField.uxml 以在 UI 构建器中打开它。ExampleField 显示在层次结构窗口中,并在 视口用户屏幕上应用程序的可见区域。
    参见 术语表
    中可视化。如果在层次结构窗口中选择 ExampleField,则 检查器一个 Unity 窗口,显示有关当前选定的游戏对象、资源或项目设置的信息,允许您检查和编辑值。 更多信息
    参见 术语表
    窗口将显示分配给“绑定路径”和“标签”框的值。
  2. ExampleField 文件夹中,创建一个名为 ExampleFieldComponent.cs 的 C# 脚本,并将其内容替换为以下内容
using UnityEngine;

namespace UIToolkitExamples
{
    public class ExampleFieldComponent : MonoBehaviour
    {
        [SerializeField]
        double m_Value;
    }
}

创建绑定目标的自定义编辑器

  1. ExampleField 文件夹中,创建一个名为 Editor 的文件夹。
  2. Editor 文件夹中,创建一个名为 ExampleFieldCustomEditor.cs 的 C# 脚本,并将其内容替换为以下内容
using UnityEditor;
using UnityEngine.UIElements;
using UnityEngine;

namespace UIToolkitExamples
{
    [CustomEditor(typeof(ExampleFieldComponent))]
    public class ExampleFieldCustomEditor : Editor
    {
        [SerializeField]
        VisualTreeAsset m_Uxml;

        public override VisualElement CreateInspectorGUI()
        {
            var parent = new VisualElement();

            m_Uxml?.CloneTree(parent);

            return parent;
        }
    }
}

测试示例

  1. 在 Unity 中,在 项目窗口显示 Assets 文件夹内容的窗口(项目选项卡) 更多信息
    参见 术语表
    中选择 ExampleFieldCustomEditor.cs
  2. ExampleField.uxml 拖动到检查器窗口中的“Uxml”框中。
  3. 场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,放置环境、障碍物和装饰,从本质上讲是分段设计和构建游戏。 更多信息
    参见 术语表
    添加一个空 游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路径点等。游戏对象的函数由附加在其上的组件定义。 更多信息
    参见 术语表
  4. ExampleFieldComponent 组件添加到游戏对象。自定义控件将出现在检查器中,绑定目标的默认值为 0。如果更改底层双精度属性的值,则 UI 会反映该更改。

其他资源

创建滑块切换自定义控件
为自定义控件创建自定义样式