型コンバータを使用して、データソースと UI 間でデータ型を変換できます。URL リンクを追加することができます。
int 値から Texture2D プロパティへのバインディングなど)。型コンバータには、グローバルコンバータとバインディングごとのコンバータの 2 つのカテゴリがあります。
グローバルコンバータは静的に登録され、バインディングモードに関係なく、すべてのバインディングインスタンスで使用できます。バインディングシステムには、スタイル値とその基となるデータ表現間の変換など、事前登録された便利なグローバル変換がいくつかあります。データソースで StyleFloat を使用する代わりに、通常の float または StyleKeyword を 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 型では不便です。この制限は、今後のリリースで対処される予定です。