次の方法で共有


データ バインディングとテーマ フレームワーク — MRTK3

MRTK3 データ バインディングとテーマ フレームワークへようこそ。 このフレームワークは、1 つ以上のデータ ソースから提供されるデータによって実行時に動的に設定および更新できるビジュアル要素を簡単に作成できるように設計されています。

データ バインディングとは

データ バインディングは、アプリケーションの UX (ビュー) と表示されるデータ (モデル) との間の接続を確立するプロセスです。 バインドに正しい設定があり、データが適切な通知を提供するとします。データが値を変更すると、データにバインドされた要素に自動的に変更が反映されます。

一般的なデータ バインディング フレームワーク:

  • Delphi
  • Windows Presentation Framework (WPF .NET)
  • Windows フォーム
  • Angular
  • Backbond
  • JavaFX バインド

Windows Presentation Framework のデータ バインディング ブロック図

Databinding Windows Presentation Framework (WPF) 詳細については、「データ バインディングの概要 - WPF.NET」を参照してください。


MRTK と同等のブロック図

MRTK と同等のブロック図


設計目標

  • クロス プラットフォーム - 任意の場所にデプロイ
  • データ ソースの組織構造と配信元をサポートする
  • 既存のコード ベースまたはグリーンフィールド コード ベースに簡単に統合
  • Designerと開発者向け
  • アプリケーションのライフサイクル中にいつでも有効/無効にすることができます
  • 実際のエンタープライズ シナリオ --バックエンド DB、複雑な UX プレハブ テンプレートをサポートする
  • MRTK 以外の既存の UX コンポーネントと新しいビジュアル要素に簡単に適用できます
  • スプライト、画像、素材、アニメーション、オーディオ クリップなどのデータ型をバインドする
  • 既存のコード ベースに触れることなく機能を簡単に強化
  • CPU、RAM、GC、フレームタイムの効率的な使用
  • さまざまなローカル データ ソースまたはバックエンド データ ソースと簡単に統合できます
  • 埋め込み、ランタイム状態、バックエンド データ ソースの任意の同時組み合わせ
  • リスト表示の任意のサイズのコレクションを効率的に処理する
  • テーマ設定と、テーマ可能な動的データ要素のデータ バインディングの組み合わせ
  • 表示する前に、オープン エンドの方法で変数データを検証して操作する
  • 他の MRTK 機能への最小限の依存関係
  • MRTK v2 および MRTK3 と互換性があります
  • 簡単にホワイトラベルを付けたり、最小限の労力でストック資産にブランド化を適用したり

主な機能

  • オープン エンド データ ソースでは、永続化された、リモートまたは RAM のデータ戦略がサポートされます。
  • オープン エンドのデータ コンシューマーは、UX バインディングとテーマのニーズをサポートします。
  • データ ソースとコンシューマー間の自動検出により、フックアップが簡略化されます。
  • バインド プロファイルからのオプションの自動構成
  • 分離されたデータ モデルとビューでは、MVC と MVVM パターンがサポートされます。
  • ページングとスクロールによるナビゲーションを使用した仮想化されたコレクション。
  • スムーズなリスト ナビゲーションのためのコレクション項目の予測プリフェッチ。
  • コレクション オブジェクトは、GC を減らすためにプールして再利用できます。
  • データの違いをマップし、キーパス名前空間を表示できます。

現在の機能

1. データ コンシューマーを使用して変数データを視覚化する

現在サポートされています。

  • TextMeshPro と TextMesh テキスト
  • テキスト スタイルシート (テーマとアクセシビリティ用)
  • スプライト テクスチャ
  • ブール型トリガー
  • クワッド テクスチャ
  • フォント アイコン
  • コレクション: 変数データが設定されたプレハブを含む任意のサイズのリスト
  • IDataConsumer インターフェイスをサポートするその他のコンシューマー (直接または基底クラスの派生を使用)

2. さまざまなデータ ソースを使用して変数データを提供します。

  • JSON テキスト (直接または URL フェッチを使用)
  • 変数データ要素のディクショナリ
  • オブジェクト - ノード ベースの構造化データ
  • 任意の C# オブジェクトのリフレクション
  • プログラムによって変更されたデータ
  • IDataSource インターフェイスをサポートするその他のメソッド

3. リストの視覚的な表示を管理するためのリストアイテムの配置子

4. ページング、スクロール、仮想化を一覧表示する

  • データは、表示時または処理中にのみフェッチされます
  • 任意に大きなバックエンド データ セットをサポート
  • フェッチは複数のフレーム間で負荷分散されます

5. プレハブ プールを一覧表示する

  • プレハブは再利用され、再入力され、GC とインスタンス化の時間が短縮されます。

6. 実行時に要素にテーマを動的に適用する


ロードマップの機能

既に利用可能な機能に加えて、より多くの機能の最優先事項は次のとおりです。

1. データ マニピュレーター パイプライン

  • データ側とビュー側の値の間の変換
  • ローカライズ (Unity ローカライズとのシームレスな統合)
  • 書式設定
  • Validation

2. より高速/スムーズなスクロール/ページングのための予測リスト項目プリフェッチ

3. より多くのデータ コンシューマー

  • コンポーネントにパブリック プロパティを設定する
  • チェックボックスのオン/オフ状態を設定する
  • スライダーの値を設定する
  • グループ内のラジオ ボタンを設定する
  • 色の設定など、個々のマテリアル プロパティ

4. テーマ

  • アプリケーションを実行していない場合でも、エディターで適用されたテーマを表示する
  • 適用されたテーマが既定のテーマになるようにプレハブを更新して反映する
  • テーマ/スタイルの継承

用語

  • データ ソース - ランタイム状態、ローカルに永続化、またはサーバーからフェッチされるデータのプロバイダー。
  • データ ソース プロバイダー - Unity シーン グラフで公開されない可能性があるデータ ソースへのアクセスを提供する単純な MonoBehaviour。
  • データ ソースの種類 - データ コンシューマーが目的のデータ ソースを名前で指定できるように、データ ソースに割り当てられた一意の名前。
  • データ コンシューマー - データ の変更に対処する必要があるデータのコンシューマー (通常はビジュアル要素ですが、必須ではありません)。 たとえば、その目的は、データ値の変更に基づいてアクションをトリガーすることです。
  • データ コントローラー - 現在関連付けられているデータ バインド値をパラメーターとして指定してアクションを呼び出すためのメカニズム。
  • キーパス - データ ソース内の特定のオブジェクトを参照するデータ セレクター。 現在実装されているように、キーパス形式は JSON データ アクセサーの後にモデル化され、マップ、リスト、アトミック要素の入れ子になった組み合わせを解読します。
  • ローカル キーパス - 再利用可能なプレハブに永続的に埋め込み可能なデータ コンシューマー側キーパス。 コレクション エンティティと Keypath Mappers を解決すると、コレクション内の特定の項目の完全に解決されたキーパスに自動的に変換されます。 コレクションに関連付けられていない場合は、データ ソース内のデータムに直接マップすることも、最初に Keypath Mapper を使用して変更することもできます。
  • 完全解決キーパス - データ ソース内の 1 つの特定のオブジェクトにマップされる完全な絶対キーパス。 コレクション内の項目の場合、これは、1 つのコレクション エンティティの完全に解決されたキーパスと、そのコレクション エンティティの 1 つのデータ要素の相対 (ローカル) キーパスの組み合わせです。

  • Keypath Mapper - ローカル キーパスとデータ ソース フィールド名の間の省略可能な名前空間マッパー (例: "link" <-> "URL")。

  • テーマ - 特定の視覚的な美しさを実現するために必要なさまざまな資産とスタイルのセットを提供するデータ ソース。

  • Item Placer - 表示されている項目をシーンに配置する DataConsumerCollection コンパニオン。

  • データ オブジェクト プール - インスタンス化されたスタンバイ プレハブは、低 GC リスト ナビゲーション用のデータを設定する準備が整いました。

  • List Virtualization - 任意に大きなサイズのリストを設定、表示、移動する機能。

  • 予測プリフェッチ - データを事前にフェッチし、スクロール/ページングによってすぐに表示される可能性がある項目のコレクション プレハブを設定します。

  • 予測プリフェッチ - データを事前にフェッチし、スクロール/ページングによってすぐに表示される可能性がある項目のコレクション プレハブを設定します。

主な概念

データ ソース

データ ソースは、データ コンシューマーを介してデータ ビューを設定するために使用できる、任意の型と複雑さの任意の管理されたデータ セットです。 データ ソースによって管理されるデータは、静的または動的です。 データ項目に対する変更は、変更通知を受け取るために登録されているデータ コンシューマーに報告されます。

データ ソース プロバイダー

データ ソースを取得する 1 つのメソッドを持つ単純なインターフェイス。 これは、MonoBehavior スクリプト コンポーネントがデータ コンシューマー コンポーネントによってゲーム オブジェクト階層で自動検出されるように設計されています。 ゲーム オブジェクト自体にデータ ソースを直接実装する必要はありません。 これは、既存の MonoBehaviour が別のクラスから派生する必要があり、複数の継承によって DataSourceGOBase からの派生が妨げる場合に便利です。 また、より多くのコードがUnityの依存関係を持たなくなります。

データ ソース プロバイダー シングルトン

DataSourceProviderSingleton MonoBehaviour を使用すると、それをリッスンする DataConsumers と同じ GameObject 階層にない場合でも、自動的に検出できるデータ ソースを指定できます。 DataSourceProviderSingletonシーン内の任意の場所に配置し、Data Sources プロパティに、データ コンシューマーによって検出されるすべてのデータ ソースを設定するだけです。 または、データ コンシューマーは親を歩いて適切なデータ ソースを見つけます。これは、目的のデータを提供するデータ ソースを、それらのデータ コンシューマーの親チェーン内の任意の場所に配置できることを意味します。

キー パス (文字列)

キー パスは、データ ソース内の情報を一意に識別するメカニズムです。

キー パスはデータ項目ごとに任意の一意識別子を指定できますが、現在の実装では、構造化データ セット全体に対する対象データのナビゲーション位置を示す論理ユーザー読み取り可能な指定子が使用されます。 これは、リスト、辞書、プリミティブの Javascript の概念に基づいてモデル化されています。 キー パスは、JSON で表すことができるデータにアクセスするための構文上正しい Javascript ステートメントです。 この方法の利点は、JSON と XML の両方に適切に関連付けられます。 これらは、バックエンド サービスから情報を転送する最も一般的な 2 つの方法です。

キー パスの例:

  • 温度
  • contacts[10].firstName
  • contacts
  • contacts[10].addresses[3].city
  • [10].title
  • kingdom.animal.mammal.aardvark.diet.foodtypes.termites

キー パスが必要な分類を持たない任意の文字列であることを考えると、実際のデータ指定子は、取得するデータを記述する任意のメソッドである可能性があります。 XML の XPath は、データ ソースで動作する実行可能なキー パス スキーマの例です。 データ コンシューマーによって提供されるキー パスが、データ ソースによって予期されるキーパスと一致している限り、すべてが機能します。 さらに、キー パス マッパーを実装して、異なるスキーマ間で変換することもできます。

キー パスの解決

キー パスを解決するということは、次の 2 つのキーパスを組み合わせることを意味します。

  1. 多数のエントリのリスト内の 1 つのエントリなど、大規模なデータセットの特定のサブセットにアクセスする方法を説明する絶対キーパス。
  2. リストまたはマップ エントリ内の特定のデータムを表す部分 (相対) キーパス。

これにより、より大きなデータ セット階層のどこに実際に存在するかは関係ないように、データのサブセットを扱うことができます。 この機能の最も重要な用途は、現在のインスタンスが参照しているリスト内のエントリを気にせずに、リスト内の 1 つのエントリのデータを記述することです。

"完全に解決された" キー パスは常に生成され、DataSource によって使用されるため、DataConsumer やその他の外部コンポーネントによって変更されることはほとんどありません。また、変更されることはないため、DataSource に適した任意の構造を持つことができます。 たとえば、写真とそのタイトル、撮影日、その他の属性のリスト エントリを表示するプレハブがある場合、プレハブ内のローカル キー パスは次のようになります。

  • "photo_url"
  • "title"
  • "date_taken"
  • "description"

リスト内の 1 つのプレハブ エントリの完全に解決されたキー パスは、次のようになります。

  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/photo_url"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/title"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/date_taken"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/description"

キー パス マッパー (IDataKeyPathMapper)

キー パス マッパーを使用すると、データ ソースとデータ コンシューマーは、キー パスに異なる名前空間と規則を使用し、引き続き連携できます。

ユーザーの連絡先情報を表示するスレートなど、一般的に使用される要素のプレハブには、データ コンシューマーによって管理される可変フィールドを含めることができます。 これを可能にするには、プレハブの任意の変数の側面に使用される識別子を、プレハブの各使用で、その変数要素の内容を決定するデータ ソース内の正しいデータムの識別子にマップする方法が必要です。 キー パス マッパーを使用すると、これを可能にします。

プレハブは、データが異なる組織構造に格納され、フィールド名を使用する異なるデータ ソースで使用できます。 各データ ソースでテンプレート プレハブを使用するために、キー パス マッパーは、データの編成方法の違いを解決できます。

データ コンシューマー (IDataConsumer)

データ ソースによって管理されている情報を使用し、そのデータを使用してデータ ビューを設定する方法を認識するオブジェクト。

データ コンシューマーは、データ ソースに登録して、データセット内の指定されたキー パスに存在するデータ項目に対する変更を通知できます。 指定されたデータが変更された (または変更が疑われる) たびに、データ コンシューマーに通知されます。

データ コンシューマーコレクション

データ コンシューマー コレクションには、同様の項目の一覧を管理する機能が追加されています。 この一覧には、データ ソースによって管理されるデータ セット全体、またはサブセットのみを指定できます。 通常、リスト内の各項目のデータには同様の種類の情報が含まれていますが、これは要件ではありません。 データ ソースとデータ コンシューマーは、連絡先リスト内の各ユーザーに関連付けられている写真のリスト内の各写真に関連付けられているキーワードの一覧など、入れ子になったリストをサポートできます。 キーワードのキーパスは写真に対して相対的であり、写真のキーパスは人物を基準とし、人物のキーパスは最も近い親リストまたはデータ セットのルートを基準とします。

コレクションを処理する場合、コレクション内の特定のエントリの正しい解決されたキーパスが、コレクション項目ごとにインスタンス化されたプレハブ内にある各データ コンシューマーに割り当てられます。 これは、そのプレハブ内の相対 (ローカル) ビュー データのキー パスを完全に解決するために使用されます。

データ収集項目配置子

コレクション データ コンシューマーには、製品、写真、連絡先のスクロール可能なリストに含まれる可能性がある内容など、繰り返し表示される要素の一覧をユーザー エクスペリエンスに設定する手段が必要です。 これは、コレクション データ コンシューマーに項目配置子を割り当てることで実現されます。 この項目配置子は、リスト項目を要求し、変数データが設定されたプレハブを受け入れ、通常はリストの UX レイアウト コンポーネントによって管理されるリストに挿入してユーザーに提示する方法を知っているロジックです。

テーマ

テーマは、データ ソースとデータ コンシューマーのすべての配管を使用します。 GameObjects の階層は、静的であるか、他のデータ ソースに動的にデータ バインドされているかに関係なくテーマを設定できます。 これにより、データ バインディングとテーマの両方を組み合わせて適用できます。 別のデータ ソースからのデータをテーマにすることもできます。

ブロック ダイアグラムとデータ フロー

MRTK テーマ データ フロー

MRTK テーマ

テーマは、多くの UX 要素の視覚的な美しさを一度に変更する機能です。 通常、テーマを指定するために必要なすべてのデータは、Scriptable オブジェクトなどの単一のデータ ソースによって提供されます。 また、テーマ データを必要に応じて提供したり、目的に基づいて論理グループに分割したりすることもできます。

MRTK3 テーマ

MRTK3 テーマとデータ バインディングの組み合わせ

データ バインディングとテーマは、1 つの UX 要素に対して共存できます。 個々の UX 要素は、テーマとデータ バインドを同時に行うことができます。 このシナリオでは、一般的なフローでは、DataSource から取得したデータムを使用して、正しいテーマ キーパスを派生させます。 このキーパスは、テーマのデータ ソース (通常は ScriptableObject プロファイル) からオブジェクトを取得するために使用されますが、キーパスを解決できるデータのソースである可能性があります。

テーマとデータ バインドの構成を簡略化するために、インスタンス化時に BindingConfigurator によって処理されるバインド プロファイルを作成できます。

  • BindingConfigurator、バインディング プロファイルを処理して、テーマを設定するプレハブ内の資産を決定し、バインドされたデータ要素とテーマ可能な要素の両方を Keypaths に関連付けます。 次に、適切な DataConsumers を追加して、これらのビジュアル要素を、通常はプレハブ自体の外部にある 1 つ以上の DataSources内の特定のデータを参照するために使用される正しい Keypaths セレクターにバインドします。
  • テーマ データは、バインド プロファイルで識別された各キーパスのデータを含む DataSource によって提供されます。
  • ThemeProvider ヘルパー スクリプトを使用すると、テーマのDataSourceとして ScriptableObject を簡単に使用できます。
  • 標準 UX テーマは、ThemeProviderDataSourceReflectionにバインドされている MRTK_UX_ThemeProfileScriptableObject によって提供されます。

テーマ プロファイル DataSource フロー図

埋め込みデータ ソース

埋め込みデータ ソースは、次の 2 つの状況で適切です。

  1. プレハブの各インスタンスに異なるテーマ設定があり、独自の個別のデータ ソースが必要な場合。
  2. このプレハブのすべてのインスタンスが 1 つの一般的な永続化されたテーマ プロファイル (ScriptableObject など) によって管理され、埋め込みデータ ソースを使用して提供できる場合は、確立する外部依存関係が存在しないようにします。

DataSourceReflection

これにより、リフレクションを使用してキーパスをフィールド、プロパティ、入れ子になったクラス、配列、リスト、ディクショナリにマップすることで、任意の C# 構造体またはクラスを DataSource にすることができます。 これは、Unity ScriptableObject、またはテーマ データが存在するその他の C# 構造体またはクラスに関連付けることができます。 データを含むインスタンス化されたオブジェクトは、実行時に依存関係を挿入して変更できます。

  1. Scriptable オブジェクト: 多くのプレハブ間で共有される静的テーマに便利です。
  2. 永続化されていない C# 構造体またはクラス: テーマの動的な実行時の変更に役立ちます。

DataSourceJson

データがテキスト json として存在する場合、これにより、 json DOM へのキーパスのマッピングが管理されます。 バイナリ資産は、Unityのリソース、StreamingAssets、またはフェッチされた URL から取得できます。

DataSourceDictionary

これは、純粋にフラットなリストがニーズを満たすのに十分で、ラピッドプロトタイピングに適している場合の単純なオプションです。 テキスト、Unityアセット (マテリアル、スプライト、イメージなど)、リソースStreamingAssets、URL を介した外部フェッチなど、すべてのテーマアセットがサポートされています。

カスタム

単純な IDataSource インターフェイスを実装するカスタム データ ソース、または DataSourceBase または DataSourceGOBase から派生するカスタム データ ソースは、カスタム ニーズを満たすために使用できます。

テーマ UXComponents

UXComponents パッケージで提供される標準の UXComponents コントロールはすべて、テーマをサポートするように構成されています。 既定ではオフになっていますが、有効にするのは簡単です。

各コントロール (通常、ルート プレハブの最上位の GameObject 上) には、UXBindingConfigurator というスクリプトがあります。 このスクリプトを有効にすると、必要なデータ バインディング スクリプトがプルされ、テーマが有効になります。 データ バインディングとテーマ パッケージも必ずインポートしてください。

TextMeshPro スタイルシートに関する注意: 現在、スタイルシートを使用して TextMeshPro 標準 スタイルのスタイルを設定することはできません。 TextMeshPro の 既定のスタイル シート に含まれるその他のスタイルを使用できます。 この例では 、Body を使用してこの制限を回避します。

DataSourceThemeProvider

DataSourceThemeProvider MonoBehaviour を使用すると、すべてのテーマアセットへのすべての参照を含む ScriptableObject をデータ ソースとして簡単に機能させることができます。 これは UXThemingExample シーンで示されています。

ThemeSelector

ThemeSelector MonoBehaviour を使用すると、複数の ScriptableObject プロファイルを指定して簡単にスワップできます。 たとえば、"ダーク" テーマと "ライト" テーマを簡単に切り替えることができます。 ScriptableObjects を Theme Profilesに追加します (通常はデザイン時)。 次に、実行時に、 Current Theme プロパティを変更してテーマを変更します。

データ コンシューマーのテーマ

テーマは、データ コンシューマー、特に DataConsumerThemeBase<T>、DataConsumerTextStyle、および任意の開発者がテーマのサポートを強化するために実装できるカスタム DataConsumer クラスから継承するものによって実現されます。

DataConsumerThemeBase<T> 基本クラスは、プライマリ データ ソースの整数またはキーデータムを使用して、セカンダリ テーマ データベースから目的の最終的な値を検索するロジックを提供します。 これは、入力データをテーマ キーパスにマッピングし、そのテーマ キーパスを使用して最終的な値を取得することで実現されます。 これにより、任意の要素をデータ バインドとテーマの両方で同時に指定できます。 たとえば、状態が [新規]、[開始]、[完了] の状態が 0、1、2 で表されるデータベースの状態フィールドを想像します。 これらのそれぞれは、スプライト アイコンで表すことができます。 データ バインディングの場合、0 から 2 の値を使用して目的のスプライトを検索します。 テーマ設定とデータ バインディングでは、テーマ プロファイルはテーマ プロファイル内の 3 つのスプライトの正しいリストを指し示し、0 から 2 の値を使用してそのリストから正しいスプライトを選択します。 これにより、これらのアイコンのスタイルをテーマごとに異なることができます。

ランタイムのテーマ設定と動的データ バインディングの両方を同時に使用する場合、DataConsumerThemeHelper クラスを DataConsumerThemeBase 派生クラスで指定して、テーマが変更されたときに通知できます。

実行時にテーマをスワップするには、テーマ データ ソースのデータを、同じデータ オブジェクト モデル トポロジにレイアウトされた新しいデータ セットに置き換えます。 DataSourceReflection は、各プロファイルがテーマを表す ScriptableObjects で使用できます。 すべての MRTK Core UX コントロールのテーマ プロファイルは、MRTK_UXComponents_ThemeProfile という名前の ScriptableObject です。 ThemeProvider.cs ヘルパー スクリプトを使用すると、このプロファイルまたは ScriptableObject プロファイルをデータ ソースとして簡単に使用できます。

テーマを動的データに適用する方法は、ほとんどの場合、自動的に検出することも、明示的に指定することもできます。

データムを使用してテーマ データ ソースから正しい項目を選択する場合、プロセスは次のようになります。

  • プライマリ データ ソースのデータムを使用して、正しいテーマ キーパスを選択または構築します
  • テーマ キーパスは、DataConsumerThemeHelper で指定されたテーマ データ ソースから値を取得するために使用されます
  • 取得したテーマ値を分析して、正しい取得方法を自動検出する
  • 次に、自動検出されたメソッドを使用して、正しい型 (Material、Sprite、Image など) の最終的なデータ項目が取得されます。

データ型

目的のオブジェクトを取得するために使用されるデータムの予期されるデータ型は、次のいずれかになります。

データ型 説明
AutoDetect データムが分析され、正しい解釈が自動的に検出されます。 詳細については、以下の「データ型の自動検出」を参照してください。
DirectValue データムは、目的の T 型 (マテリアル、スプライト、イメージなど) であると想定され、直接使用されます。
DirectLookup ローカル参照テーブルから目的の値を検索するために使用される整数インデックスまたは文字列キー。
StaticThemedValue 正しい型の静的テーマ オブジェクトは、指定されたテーマ キーパスのテーマ データ ソースから取得されます。
ThemeKeypathLookup 整数インデックスまたは文字列キーを使用して、目的のテーマ キーパスを検索します。
ThemeKeypathProperty Theme で提供されるテーマの基本キーパスに追加される文字列プロパティ名。
ResourcePath Unity リソースから値を取得するためのリソース パス ("resource://" で始まる場合があります)。
FilePath Unity ストリーミング資産を取得するためのファイル パス ("file://" で始まる場合があります)。

データ型の自動検出

自動検出は、受信したデータを分析し、取得方法を自動的に決定します。 次の表では、T は、マテリアル、スプライト、イメージなどの目的の種類を表します。 自動検出は、プロセス内の 2 つの場所で発生する可能性があります。

  • プライマリデータム値自体。
  • プライマリデータムを介して取得されたテーマ値。
データムの種類 考慮事項 テーマ ヘルパーがある 動作
T 該当なし Y/N テーマなしで直接使用
int 整数プリミティブまたは Int32 解析可能な文字列 いいえ T 型の N 番目のオブジェクトを取得するために、派生 GetObjectByIndex(n) にインデックスとして渡されます。
int 整数プリミティブまたは Int32 解析可能な文字列 はい ローカル参照から N 番目のテーマ キーパスをフェッチし、自動検出を使用してテーマオブジェクトを取得するインデックス。
string 形式: "resource://{resourcePath}" Y/N resourcePath は、リソースUnity取得するために使用されます
string 形式: "file://{filePath} Y/N filePath は、ストリーミング資産を取得するために使用されます
string その他 いいえ T 型の一致するオブジェクトを取得するために、派生 GetObjectByKey() にキーとして渡されます。
string その他 はい ローカル参照から一致するテーマ キーパスをフェッチし、自動検出を使用してテーマオブジェクトを取得するキー。

数値の状態値を含むデータベースからテーマ付き状態アイコンを取得する例:

  1. データベース内の状態アイコンのキーパスがstatus.sprite_index。
  2. status.sprite_indexの取得された値は 2 で、"取り消された" 状態を意味します。
  3. DataConsumerSprite 参照の N=2 (つまり、3 番目) エントリは "Status.Icons.Cancelled" に設定されます。
  4. これは、"theme" データ ソースから値を取得するために使用されるキーパスです。
  5. "Status.Icons.Cancelled" キーパスの値は "resource://Sprites/sprite_cancelled" です。
  6. 自動検出は、"Resources/Sprites/sprite_cancelled" にあるリソースを介してアイコンを取得する必要があることを判断します

TextMeshPro スタイルシート

テーマは TMPro スタイルシートをアクティブ化できます。 "TMP 設定" ScriptableObject は、スタイルシートがリソース内のどこにあると想定されているかを指定します。 "既定のフォント資産 => パス" プロパティです。

アプリ固有のスタイルシートは、必ずリソースの同じサブパスに配置してください。 別の方法で整理する場合は、必ず一致するように "TMP 設定" を更新してください。

新しい UX コントロールをテーマに設定する

新しい UX コントロールを開発する場合は、比較的簡単に操作できます。 コントロールが他の UX コントロールで既に使用されているマテリアル、スプライト、およびその他のアセットを使用する範囲では、一般に、検出可能な方法でさまざまなゲーム オブジェクトに名前を付ける必要があります。

MRTK_UXCore_ThemeProfileから継承し、テーマを設定できるフィールドを追加したり、独自の ScriptableObject にコントロールをポイントしたりできます。 提供されたものには魔法はありません。ScriptableObject のorganizationは、C# リフレクションを使用して個々のデータ項目にアクセスするために必要なキーパスを決定します。

BindingConfigurator.csスクリプトを新しいコントロールの最上位レベルに追加することで、独自のシリアル化された BindingProfile ScriptableObject を指定できます。 これにより、テーマ プロファイルで提供されるデータにテーマ要素を関連付けるために必要な KeyPath マッピングに必要な GameObject 名が提供されます。 このスクリプトは、使用するテーマをサポートするために、実行時に必要な DataConsumerXXX コンポーネントを自動的に追加します。

はじめに

要件

  • Unity 2020.3 LTS 以降
  • TextMeshPro 2.1.4 以降

サンプル シーン

最初の手順では、MRTK Examples パッケージのさまざまなデータ バインディングのサンプル シーンを詳しく見て、さまざまなデータ ソース MonoBehaviours がどのように構成されているかを確認します。 一般に、データ バインディング スクリプトは、プレハブまたは関連する UX 要素のセットの最上位レベルの GameObject にのみ配置する必要があります。

また、ほとんどのユース ケースでは、既定値は "すぐに使用できます" 機能しますが、公開されるプロパティは、より高度なケースに対して多くの柔軟性を提供します。

注:

標準 MRTK UX コンポーネントのテーマを有効にするには、 MRTK_UX_DATABINDING_THEMING_ENABLED シンボルを [プレイヤー設定] で定義する必要があります。 この記号を使用すると、テーマを設定する必要がない場合にパフォーマンスへの影響がゼロになります。

Assets/DataBinding Example/Scenes/DataBindingExamples.scene

さまざまな変数データ シナリオを示すこのシーン。 シーンを読み込んで再生するだけです。 注目すべき点がいくつかあります。

  • TextMeshPro コンポーネントの [テキスト入力] フィールドには、{{ firstName }} のような変数が含まれています。 これらのマーカーは、ローカル キーパスとして直接使用されます。

  • スプライトとテキストのゲーム オブジェクトには、データの受信とビューの更新を管理する何らかの形式の Data Consumer コンポーネントがあります。

  • 単一のデータ コンシューマーは、GO 階層の上位に配置することで、同じ型の複数のコンポーネントで共有できます。

  • データ コンシューマーは、GO 階層内の同じゲーム オブジェクト以上にある限り、独自のデータ ソースを見つけることができます。

  • 親ゲーム オブジェクトには、関連する一連の変数情報を表示するすべての子ゲーム オブジェクトのデータを提供するデータ ソース コンポーネントがあります。

  • コレクション データ コンシューマーは、そのプレハブに変数データを設定するために使用されるデータ コンシューマーを含むプレハブを指定します。

Assets/UX テーマの例/シーン/AudioTheming

この例では、テーマを使用して AudioClips をピアノのセットと Xylophone 用のセットに切り替えます。

Assets/UX テーマの例/シーン/BatteryLevelExample

この例では、テーマとデータ バインディングを組み合わせて、バッテリー レベルを数値とアイコンの両方として表示します。 テーマは、"充電中" テーマと "充電していない" テーマの間で選択するために使用されます。 これは、次の目的を満たすように設計されています。

  • すべてのビジュアルアセットは、テーマ プロファイルとして機能する 1 つの ScriptableObject に存在できます。
  • "充電" 状態のスプライトの数は、"充電しない" 状態の数とは異なる場合があります。
  • 報告されたバッテリ レベルを特定のスプライトにマッピングするためのアルゴリズムは、非線形であり、"充電" と "充電不可" の状態が異なる場合があります。
  • すべてのビジュアルアセットは、テーマ プロファイルとして機能する 1 つの ScriptableObject に存在できます。
  • 充電状態のスプライトの数は、充電状態でない場合の数と異なる場合があります。
  • 報告されたバッテリー レベルを、スプライトを非線形にすることができ、充電状態と充電状態とは異なる状態にマッピングするためのアルゴリズム。

注:

このデモの構造は、テーマとデータ バインディングを組み合わせる良い例ではありません。 モデルとビューを適切に分離するための運用アプリケーションでは、実際のバッテリ状態 (レベルと充電) は、スプライト自体のリソース ロケーターとは別のデータ ソースで提供されます。

Assets/UX テーマの例/Scenes/UXThemingExample

この例では、アプリケーション全体のテーマの変更を示し、UX に表示されるさまざまなテキスト コンテンツを管理するためのデータ ソースとして DataSourceGODictionary を使用する方法も示します。 より包括的なシナリオでは、他のより柔軟なデータ ソースの種類は、 DataSourceReflectionDataSourceGOJsonなど、必要な柔軟性を提供する可能性があります。

最初のデータ バインディング プロジェクト

すぐに始めるのに役立つ簡単な例を次に示します。

  1. 新しいシーンを作成します。
  2. [Mixed Reality ツールキット] メニューで、[シーンに追加して構成] オプションを選択します。
  3. 空のゲーム オブジェクトを作成し、名前を "Data Binding" に変更します。DataSourceJsonTest コンポーネントを追加します。
  4. インスペクターで、URL を次のように変更します。 https://www.boredapi.com/api/activity
  5. UI -> Text - TextMeshPro オブジェクトを Data Binding ゲーム オブジェクトに追加します。 キャンバスと "Text (TMP)" オブジェクトが追加されます。
  6. Text (TMP) オブジェクトを選択し、Inspector で [テキスト入力] を 次のように変更します。

{{ activity }}. It's {{ type }}.

  1. Canvas オブジェクトを選択し、データ コンシューマー テキスト コンポーネントを追加します。
  2. プロジェクトを実行します。 15 秒ごとに、別のアクティビティが表示されます。

万丈。 MRTK を使用して最初のデータ バインディング プロジェクトを作成しました。

新しいデータ ソースの作成

データ ソースは、1 つ以上のデータ コンシューマーにデータを提供します。 そのデータは、アルゴリズムによって生成される、RAM、ディスク上、または中央データベースからフェッチされるなど、何でもかまいません。

すべてのデータ ソースは、IDataSource インターフェイスを提供する必要があります。 基本的な機能の一部は、 DataSourceBase と呼ばれる基底クラスで提供されます。 ほとんどの場合、このクラスから派生して、ニーズに固有の特定のデータ管理機能を追加する必要があります。

データ ソースをコンポーネントとしてゲーム オブジェクトにドロップできるようにするために、GO が GameObject を表す DataSourceGOBase という別の基本オブジェクトが存在します。 これは MonoBehavior であり、コンポーネントとして GameObject にドロップできます。 これは、Unity以外のコア データ ソースに作業を委任するように設計されたシン プロキシです。

データ ソースでは、Unity エディター内のデータを操作する機能が公開される場合があります。 この場合、派生クラスにはすべてのデータ ソース ロジックを含めることができます。また、"ストック" データ ソースを利用することもできますが、Inspector フィールドやその他の方法でデータを構成することもできます。

新しいデータ コンシューマーの作成

データ コンシューマーは、データが変更されたときに通知を受け取り、TextMeshPro コンポーネントに表示されるテキストなど、ユーザー エクスペリエンスの一部を更新します。

すべてのデータ コンシューマーは、IDataConsumer インターフェイスを提供する必要があります。 基本的な機能の一部は、go が GameObject を表す DataConsumerGOBase と呼ばれる基本クラスで提供されます。

データ コンシューマーの作業の大部分は、新しいデータを受け入れてプレゼンテーション用に準備することです。 これは、適切なプレハブを選択するのと同じくらい簡単な場合や、コンテンツ管理システムなどのクラウド サービスからより多くのデータをフェッチすることを意味する可能性があります。

データ 収集項目配置子の作成

データ 収集項目配置子は、コレクションのどの部分が現在表示されているか、コレクションが小さな静的リストであるか、巨大な 100 万レコード データベースであるかに関係なく、その表示されるコレクションを表示する方法を管理する役割を担います。

すべての項目配置子は、IDataCollectionItemPlacer インターフェイスを提供する必要があります。 基本的な機能の一部は、 DataColletionItemPlacerGOBase と呼ばれる基底クラスで提供されます。 すべての項目配置子は、このクラスから派生する必要があります。

既知の制限事項と不足している機能

  • まだUnityのキャンバス ベースのコントロールやスクロール可能なリストと統合されていません。
  • .NET INotifyPropertyChanged の統合はまだ実装されていません。
  • Flickr と trymrtk.com からイメージをフェッチするサンプル シーンは、以降のバージョンのUnityの HTTPS SSL バグのため、HoloLens では機能しません。
  • パフォーマンスチューニングの追加。
  • このリリースでは、データ キャプチャではなく、データの表示に重点を置いています。 MRTK UX コントロールは、 DataSourceで状態を設定するためにまだワイヤードされていません。
  • リスト データを動的に変更すると、増分更新ではなくリスト全体が完全に更新されます。
  • データ操作パイプラインはまだ実装されていません
  • スレート上のすべての UX コンポーネントの設定はまだ完全にはサポートされていません。
  • DataSourceJson ノードは、DataSourceObjects と相互運用 IDataNode インターフェイスを実装する必要があります。