版本 :6000.0+
此示例演示了如何创建类型转换器,以便在数据源和UI之间转换数据。
此示例将在UI构建器中创建一个与数据源资产结合的标签控件。数据源资产包含一个名为的浮点属性dangerLevel
。标签显示dangerLevel
作为字符串并根据dangerLevel
。
您可以找到此示例在此创建的已完成的文件GitHub存储库。
本指南适用于熟悉UNITY编辑器,UI Toolkit 和 C# 脚本的开发人员。在开始之前,请熟悉以下内容:
创建一个数据源资产,其中包含您要绑定到的属性。在此示例中,您创建一个ScriptableObject
资产命名ExampleConverterObject
其中包含一个局部转换器,该转换器转换float
到Color
和string
。
Assets
项目的文件夹,创建一个C#脚本ExampleConverterObject.cs
,具有以下内容: using Unity.Properties;
using UnityEngine;
using UnityEngine.UIElements;
# if UNITY_EDITOR
using UnityEditor;
# endif
[CreateAssetMenu]
public class ExampleConverterObject : ScriptableObject
{
# if UNITY_EDITOR
[InitializeOnLoadMethod]
# else
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
# endif
public static void RegisterConverters()
{
// Create local Converters.
var group = new ConverterGroup("Value To Progress");
// Converter groups can have multiple converters. This example converts a float to both a color and a string.
group.AddConverter((ref float v) => new StyleColor(Color.Lerp(Color.red, Color.green, v)));
group.AddConverter((ref float value) =>
{
return value switch
{
>= 0 and < 1.0f/3.0f => "Danger",
>= 1.0f/3.0f and < 2.0f/3.0f => "Neutral",
_ => "Good"
};
});
// Register the converter group in InitializeOnLoadMethod to make it accessible from the UI Builder.
ConverterGroups.RegisterConverterGroup(group);
}
[Header("Binding using a converter group")]
[Range(0, 1)] public float dangerLevel;
}
Assets
您项目的文件夹。ExampleConverterObject.asset
。创建一个UI,该UI绑定到您在上一步中创建的数据源资产。在此示例中,您创建一个包含标签控件的UXML文件。
Assets
项目的文件夹,创建一个名为uxml文件ExampleConverterObject.uxml
。ExampleConverterObject.uxml
文件以在UI构建器中打开。将标签的属性绑定到数据源资产的属性,并应用标签的类型转换器。
在Hierarchy 面板,选择Label 。
在Inspector 面板,来自 Bindings > Data Source > Object 列表,选择 extpleconverterObject 。
来自 Data Source Path 列表,选择dangerLevel 。
在 Inspector面板,右键单击Text字段和选择Add binding 。
选择 Add Binding 应用您的更改。
在 Inspector 面板,扩展 Background 字段。
右键单击 Color 属性并选择 Add binding 。
选择 Add binding 应用您的更改。
保存并关闭UI构建器。你的ExampleConverterObject.uxml
文件看起来如下:
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance"
engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
<ui:Label text="Label" data-source="ExampleConverterObject.asset" data-source-path="dangerLevel">
<Bindings>
<ui:DataBinding property="style.backgroundColor" binding-mode="ToTarget" source-to-ui-converters="Value To Progress" />
<ui:DataBinding property="text" binding-mode="ToTarget" source-to-ui-converters="Value To Progress" />
</Bindings>
</ui:Label>
</ui:UXML>
在检查员窗口ExampleObject.asset
,移动 Danger Level 滑块。UI Builder 中 Label 的文本和背景颜色 Viewport 根据 Danger Level 的值而变化。