您可以使用类型转换器在数据源和__ UI__(即用户界面,User Interface)让用户能够与您的应用程序进行交互。Unity 目前支持三种 UI 系统。更多信息
See in Glossary 之间转换数据类型。因此,您可以:
int 值绑定到 Texture2D 属性。类型转换器分为两类:全局转换器和每绑定转换器。
全局转换器是静态注册的,适用于所有绑定实例,无论绑定模式如何。为方便起见,绑定系统提供了几个预注册的全局转换器,例如样式值及其底层数据表示之间的转换器。您可以使用它们将常规 float 或 StyleKeyword 绑定到 StyleFloat 属性,而不是在数据源中使用 StyleFloat。
要注册全局转换器,请使用 ConverterGroups.RegisterGlobalConverter 方法。此方法需要委托以将源类型转换为目标类型。委托必须是 ref 委托才能启用双向使用。注册后,全局转换器会自动应用于任何需要该特定类型转换的绑定实例,无需任何额外配置。
以下示例注册了在 Texture2D 和 TextureHandle 之间转换的全局转换器:
public struct TextureHandle
{
public static Texture2D ResolveTexture(TextureHandle handle)
{
return /* Actual texture */;
}
public static FromTexture(Texture2D texture)
{
return new TextureHandle { handle = /* Compute handle */ };
}
public int handle;
}
// Registers the global converter
ConverterGroups.RegisterGlobalConverter((ref TextureHandle handle) => TextureHandle.ResolveTexture(handle));
ConverterGroups.RegisterGlobalConverter((ref Texture2D texture) => TextureHandle.FromTexture(texture));
每绑定转换器适用于特定的绑定实例。您可以注册单独或成组的每绑定转换器。
要注册单独的转换器,请使用 DataBinding.sourceToUiConverters.AddConverter 或 DataBinding.uiToSourceConverters.AddConverter 方法。这些方法需要委托以将源类型转换为目标类型。委托必须是 ref 委托才能启用双向使用。
以下示例注册并应用单独的转换器在绑定实例的弧度和度之间进行转换:
var binding = new DataBinding();
binding.sourceToUiConverters.AddConverter((ref float radian) => Mathf.RadToDeg * radian);
binding.uiToSourceConverters.AddConverter((ref float degree) => Mathf.DegToRad * degree);
要注册成组的转换器并将其应用于 DataBinding 实例,请使用 ConverterGroup 类。
以下示例展示了如何注册成组的转换器:
// Create a converter group
var group = new ConverterGroup("Inverters");
// Add converters to the converter group
group.AddConverter((ref int v) => -v);
group.AddConverter((ref float v) => -v);
group.AddConverter((ref double v) => -v);
// Register the converter group
ConverterGroups.RegisterConverterGroup(group);
// Add a converter to an existing converter group
if (ConverterGroups.TryGetConverterGroup("Inverters", out var group))
{
group.AddConverter((ref short v) => -v);
}
注册转换器组后,可以将其应用于绑定实例。可以用 C#、UI Builder 或 UXML 将转换器组应用于绑定实例。
要在 C# 中应用转换器组,请使用 DataBinding.ApplyConverterGroupToUI 或 DataBinding.ApplyConverterGroupToSource 方法。这些方法将转换器组名称作为参数。
以下示例将转换器组 Inverters 应用于 C# 中的绑定实例:
var binding = new DataBinding();
if (ConverterGroups.TryGetConverterGroup("Inverters", out var group))
{
binding.ApplyConverterGroupToUI(group);
binding.ApplyConverterGroupToSource(group);
}
注意:将转换器组应用于另一个转换器组时,它会以“触发即忘”的方式运行。这意味着,应用转换器组时,它会独立执行预期功能,无需您进行额外的持续监控或管理。
以下示例将转换器组 Inverters 应用于 UXML 中的绑定:
<ui:DataBinding source-to-ui-converters="Inverters" ui-to-source-converters="Inverters" />
有关如何在 UI Builder 中应用转换器组的详细信息,请参阅运行时绑定入门。
遵循以下提示和最佳实践来优化性能:
enum 类型时。在转换期间分配内存可能会引入不必要的开销并影响性能。相反,应选择高效且对内存友好的转换方法。源和目标类型必须完美匹配,除非它们是 UnityEngine.Object 类型。例如,无法将 int 转换为 float,也无法将 float 转换为 int。这可能很不方便,尤其是对于 enum 类型。此限制将在未来的版本中解决。