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

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

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

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

人気上昇中のデータ バインディング フレームワーク:

  • Delphi
  • Windows Presentation フレームワーク (WPF .NET)
  • Windows フォーム
  • Angular
  • バックボンド
  • JavaFX バインディング

Windows Presentation フレームワーク のデータ バインディング 禁止図

Databinding Windows Presentation Framework (WPF) 詳細については、 データバインディング概要をご覧ください - WPF.NET


MRTK と同等の禁止図

MRTK と同等の禁止図


設計目標

  • クロス プラットフォーム - 任意の場所にデプロイする
  • データ ソースの組織構造と配信元をサポートする
  • 既存のコード ベースまたはグリーンフィールド コード ベースに簡単に統合
  • デザイナーと開発者に最適
  • アプリケーションのライフ サイクル中にいつでも有効/無効にできます
  • 実際のエンタープライズ シナリオ (バックエンド 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 ローカライズとのシームレスな統合)
  • 書式設定
  • 検証

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

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

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

4.テーマ化

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

用語

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

  • Keypath Mapper - ローカル キーパスとデータ ソース フィールド名の間のオプションの名前空間マッパー (例: 「link」 <-> 「URL」)。

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

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

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

  • リストの仮想化 - 任意に大きなサイズのリストを設定、表示、およびナビゲートする機能。

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

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

主要概念

Data Source

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

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

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

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

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

キー パス (文字列)

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

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

キー パスの例:

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

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

キー パスの解決

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

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

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

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

  • 「写真の URL」
  • 「タイトル」
  • 「撮影日」
  • 「説明」

リスト内の 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 レイアウト コンポーネントで管理されるリストに挿入することで行われます)。

テーマ

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

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

MRTK テーマ データ フロー

MRTK テーマ設定

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

MRTK3 テーマ

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

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

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

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

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

埋め込みデータ ソース

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

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

DataSourceReflection

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

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

DataSourceJson

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

DataSourceDictionary

これは、純粋にフラットなリストがニーズを満たすのに十分で、迅速なプロトタイプ作成に適している場合のシンプルなオプションです。 テーマ設定資産は、テキスト、Unity 資産 (マテリアル、スプライト、イメージなど)、リソースストリーミング資産、外部から URL 経由でフェッチ可能なものを含めて、すべてサポートされています。

Custom

単純な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> 基本クラスは、プライマリ データ ソースの整数またはキー データムを使用してセカンダリ テーマ データベースから目的の最終的な値を検索するロジックを提供します。 これは、入力データをテーマ キーパスにマッピングし、そのテーマ キーパスを使用して最終的な値を取得することで実現されます。 これにより、あらゆる要素に対してデータ バインディングとテーマ設定を同時に行うことができます。 たとえば、New、Started、Done が値 0、1、2 で表されるデータベースの状態フィールドを想像してください。 これらはそれぞれスプライト アイコンで表すことができます。 データ バインディングでは、0 から 2 の値を使用して目的のスプライトを検索します。 テーマ設定とデータ バインディングでは、テーマ プロファイルによってテーマ プロファイル内の 3 つのスプライトの正しいリストがポイントされ、0 から 2 の値を使用してその一覧から適切なスプライトが選択されます。 これにより、これらのアイコンのスタイリングをテーマごとに変えることができます。

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

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

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

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

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

データ型

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

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

自動検出データ型

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

  • プライマリデータム値自体で。
  • プライマリデータムを介して取得されたテーマ設定値で。
データムの種類 考慮事項 テーマ ヘルパーがある 動作
T 該当なし Y/N テーマ設定なしで直接使用
int 任意の整数プリミティブまたは Int32 解析可能な文字列 No T 型の N 番目のオブジェクトを取得するために、派生した GetObjectByIndex(n) にインデックスとして渡されます。
int 任意の整数プリミティブまたは Int32 解析可能な文字列 はい ローカル検索から N 番目のテーマ キーパスをフェッチし、自動検出を使用してテーマオブジェクトを取得するインデックス。
string 形式: 「resource://{resourcePath}」 Y/N resourcePath を使用して Unity リソースを取得する
string Format: 「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 の構成で C# リフレクションが使用されて、個々のデータ項目にアクセスするために必要なキーパスが決定されます。

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

作業の開始

要件

  • Unity 2020.3 LTS以降
  • TextMeshPro 2.1.4 以降

シーンの例

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

また、ほとんどのユース ケースでは既定値が "そのまま" 動作しますが、より高度なケースについては、公開されているプロパティによって柔軟性を高めることができます。

注意

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

資産/DataBinding Example/シーン/DataBindingExamples.scene

さまざまな可変データ シナリオを示すこのシーン。 シーンを読み込んで再生するだけです。 次の点に注意してください。

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

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

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

  • データ コンシューマーは、GO 階層の同じゲーム オブジェクトかそれより上位にあれば、自身のデータ ソースを検出できます。

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

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

資産/UX テーマ設定の例/シーン/オーディオテーマ設定

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

資産/UX テーマ設定の例/シーン/バッテリレベルの例

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

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

注意

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

資産/UX テーマ設定例/シーン/UXテーマ設定例

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

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

すぐに始めるのに役立つシンプルな例を次に示します:

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

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

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

テストは成功です。 MRTK を使用して最初のデータ バインディング プロジェクトを作成しました!

新しいデータ ソースの書き込み

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

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

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

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

新しいデータ コンシューマーの書き込み

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

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

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

データ コレクション項目配置子の書き込み

データ コレクション項目の配置子は、コレクションが小さな静的リストであるかレコード数が 100 万規模の大きなデータベースであるかに関係なく、現時点でコレクションのどの部分をどのように表示するかを管理します。

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

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

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