MRが楽しい

MRやVRについて学習したことを書き残す

Mixed Reality Toolkit 3 パブリックプレビューのドキュメントを少しずつ読み解く データバインディングとフレームワークのテーマ化(主要概念)

本日は Mixed Reality Toolkit 3 の調査枠です。
Mixed Reality Toolkit 3 パブリックプレビューのドキュメントを少しずつ翻訳しつつ読み進めていきます。

Mixed Reality Toolkit 3 のドキュメント

以下のドキュメントを読み進めていきます。
docs.microsoft.com

今回は「データバインディングフレームワークのテーマ化」のページの主要概念に関する項目を読み進めます。
docs.microsoft.com

以下の記事の続きです。
bluebirdofoz.hatenablog.com

主要概念

Data Source(データソース)

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

Data Source Provider(データソースプロバイダー)

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

Data Source Provider Singleton(データソースプロバイダシングルトン)

DataSourceProviderSingleton を使用すると、受信したいデータコンシューマと同じゲームオブジェクト階層になくても自動的に検出できるデータソースを指定できます。
シーン内の DataSourceProviderSingleton を任意の場所に配置し、データコンシューマーによって検出されるデータソースを Data Sources プロパティに設定するだけです。
あるいはデータコンシューマは親親チェーンを捜索して適切なデータソースを検索します。
このため、目的のデータを提供するデータソースをそれらのデータコンシューマの親チェーンのどこにでも配置できます。

Key Path(キーパス)

キーパスはデータソース内の任意の情報を一意に識別するためのメカニズムです。
キーパスはデータ項目ごとに任意の固有 ID にすることができますが、現行の実装では構造化データセット全体に対する対象データのナビゲーション位置を示す論理ユーザーの指定子を使用しています。
これは Javascript のリスト/ディクショナリ/プリミティブの概念をモデルにしています。
キーパスは JSON で表現できるデータにアクセスするための構文的に正しい Javascript ステートメントです。
このアプローチの利点は JSONXML の両方とよく相関することです。また、これらはバックエンドサービスから情報を転送する最も一般的な 2 つの方法です。

キーパスの例:

・temperature
・contacts[10].firstName
・contacts
・contacts[10].addresses[3].city
・[10].title
・kingdom.animal.mammal.aardvark.diet.foodtypes.termites

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

Key Path(キーパス)の解決

キーパスを解決するには次の 2 つのキーパスを結合します。

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

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

「完全に解決された」キーパスは常にデータソースによって生成および使用されます。
これらはデータコンシューマまたはその他の外部コンポーネントによって変更されることは滅多にない(またはまったく変更されない)ため、データソースにとって意味のある任意の構造を持つことができます。
例えば、写真のリストエントリとそのタイトル、撮影日、その他の属性を表示するプレハブがある場合、プレハブのローカルキーパスは次のようになります。

・"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"

Key Path Mapper(キーパスマッパー) IDataKeyPathMapper

キーパスマッパーを使用すると、データソースとデータコンシューマはキーパスに異なる名前空間と規則を使用しながら連携できます。
個人の連絡先情報を表示するスレートなど、一般的に使用される要素のプレハブにはデータコンシューマによって管理される可変フィールドを含めることができます。
これを可能にするにはプレハブの変数アスペクトに使用される識別子をプレハブを使用するたびにその可変要素の内容を決定するデータソース内の正しい識別子にマップする方法が必要です。
キーパスマッパーはこれを可能にします。

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

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

データソースによって管理されている情報を使用し、そのデータを使用してデータビューにデータを取り込む方法を知っているオブジェクトです。

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

Data Consumer Collection(データコンシューマーコレクション)

データコンシューマーコレクションは類似したアイテムのリストを管理する機能を持ちます。
このリストはデータソースによって管理されるデータセット全体、または単なるサブセットにすることができます。
通常、リスト内の各項目のデータには同様の種別の情報が含まれていますが、これは必須ではありません。
データソースとデータコンシューマーは入れ子になったリストをサポートできます。

例えば、連絡先リスト内の「各ユーザー」に関連付けられている写真のリスト内の「各写真」に関連付けられている「キーワード」のリストなどです。
この場合、キーワードのキーパスは写真に対する相対パスであり、写真のキーパスはユーザーを基準にしており、ユーザーのキーパスは最も近い親リストまたはデータセットのルートを基準にしています。

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

Data Collection Item Placer(データコレクション項目配置子)

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