Version: Unity 6.0 (6000.0)
言語 : 日本語
バインディングモードと更新トリガーの定義
ログレベルの定義

データ型の変換

型コンバータを使用して、データソースと UI 間でデータ型を変換できます。URL リンクを追加することができます。

  • UI とは異なるデータ型をバインドします (int 値から Texture2D プロパティへのバインディングなど)。
  • UI と同じデータ型を変換して、ラジアンではなく度を表示するなど、データを異なる形式で表示できます。

型コンバータには、グローバルコンバータとバインディングごとのコンバータの 2 つのカテゴリがあります。

グローバルコンバータ

グローバルコンバータは静的に登録され、バインディングモードに関係なく、すべてのバインディングインスタンスで使用できます。バインディングシステムには、スタイル値とその基となるデータ表現間の変換など、事前登録された便利なグローバル変換がいくつかあります。データソースで StyleFloat を使用する代わりに、通常の float または StyleKeywordStyleFloat プロパティにバインドできます。

グローバルコンバータを登録するには、 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.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 型でない限り完全に一致する必要があります。例えば、intfloat に変換したり、floatint に変換したりすることはできません。これは、特に enum 型では不便です。この制限は、今後のリリースで対処される予定です。

追加リソース

バインディングモードと更新トリガーの定義
ログレベルの定義
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961