Version: 1.5
语言 : 中文
定义绑定模式并更新触发器
定义记录级别

转换数据类型

您可以使用类型转换器在数据源和 UI 之间转换数据类型。这使您可以:

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

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

全局转换器

全局转换器已静态注册,不论绑定模式如何,都可以使用所有绑定实例。为了方便起见,绑定系统提供了几个预注册的全局转换器,例如样式值及其基础数据表示之间的转换器。您可以使用它们来绑定常规float或aStyleKeywordStyleFloat属性,而不是使用StyleFloat在数据源中。

要注册全局转换器,请使用ConverterGroups.RegisterGlobalConverter方法。此方法要求委托将源类型转换为目标类型。代表必须是 ref 代表启用双向用法。注册后,全局转换器会自动适用于任何需要特定类型转换类型的绑定实例,而无需任何其他配置。

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

public struct TextureHandle
{
    public static Texture2D ResolveTexture(TextureHandle handle)
    {
        return /* Actual texture */; 
    } 
    
   public static TextureHandle 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构建器或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 构建器中应用转换器组的详细信息,请参阅运行时绑定入门

最佳实践

遵循以下技巧和最佳实践来优化性能:

  • 最小化内存分配 :只要有可能,避免写入内存的转换委托,尤其是在处理 enum 时。在转化过程中分配内存可以引入不必要的开销和影响性能。相反,选择有效且对内存友好的转换方法。
  • 保持转换器有效 :重要的是要保持转换器专注于执行快速有效的类型转换。避免在转换器内执行广泛的任务或复杂的操作,因为这可能导致性能下降并可能引入不必要的复杂性。
  • 将类型转换集成到数据源中 :与其仅依靠每条结合转换,而是考虑将类型转换直接纳入数据源。通过处理数据源本身中的转换,您可以简化流程并有可能提高整体性能。这种方法还可以减少与以每种绑定为基础管理转换相关的复杂性

已知限制

来源和目标类型必须完全匹配,除非它们类型UnityEngine.Object。例如,您无法转换intfloat,或float到一个int。这可能不便,尤其是enum类型。此限制将在以后的版本中解决。

其他资源

定义绑定模式并更新触发器
定义记录级别