版本:Unity 6 (6000.0)
语言:英语
定义绑定模式和更新触发器
定义日志级别

转换数据类型

您可以使用类型转换器在数据源和UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。更多信息
参见 词汇表
之间转换数据类型。这使您可以

  • 绑定与 UI 不同的数据类型,例如从 int 值绑定到 Texture2D 属性。
  • 当您想要以不同的方式表示数据时,转换与 UI 相同的数据类型,例如以度数而不是弧度显示角度。

类型转换器有两类:全局转换器和每个绑定转换器。

全局转换器

全局转换器是静态注册的,可供所有绑定实例使用,无论绑定模式如何。绑定系统提供了一些预注册的全局转换器,以方便使用,例如在样式值与其底层数据表示之间进行转换的转换器。您可以使用它们将普通 floatStyleKeyword 绑定到 StyleFloat 属性,而不是在数据源中使用 StyleFloat

要注册全局转换器,请使用 ConverterGroups.RegisterGlobalConverter 方法。此方法需要一个委托来将源类型转换为目标类型。委托必须是 ref 委托,以启用双向使用。注册后,全局转换器会自动应用于需要特定类型转换的任何绑定实例,无需任何额外配置。

以下示例注册一个全局转换器,该转换器在 Texture2DTextureHandle 之间进行转换

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.AddConverterDataBinding.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.ApplyConverterGroupToUIDataBinding.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 类型时。此限制将在未来的版本中解决。

其他资源

定义绑定模式和更新触发器
定义日志级别