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

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

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

DataConsumerThemeBase ベースクラスは一次データソースの整数値やキーデータを使って二次テーマデータベースから目的の値を検索するロジックを提供します。
これは入力データをテーマのキーパスにマップし、 そのテーマのキーパスを使用して最終的な値を取得しています。
これにより、任意の要素をデータバインドとテーマの両方に同時に対応させることができます。

例として、データベースのステータスフィールドが[新規][開始][完了]のステータスを値 0、1、2 で表現しているとして、これらはそれぞれスプライトアイコンで表現したいケースを想定します。
データバインディングでは 0 から 2 までの値を使って目的のスプライトを探します。
テーマバインディングとデータバインディングではテーマプロファイルで 3 つのスプライトの正しいリストを指し示し、そのリストから正しいスプライトを選択するために 0 から 2 までの値が使用されます。
これにより、これらのアイコンはテーマごとに異なるスタイルにすることができます。

実行時のテーマ設定と動的なデータバインディングを併用する場合、DataConsumerThemeBase 由来のクラスで DataConsumerThemeHelper クラスを指定し、テーマが変更されたときに通知することができます。

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

動的データへのテーマの適用方法はほとんどの場合、自動的に検出されますが、明示的に指定することもできます。
テーマデータソースから正しい項目を選択するためにデータを使用する場合、その処理は以下の通りです。

・正しいテーマキーパスを選択・構築するために、主データソースのデータを使用する。
・テーマキーパスを用いて DataConsumerThemeHelper で指定されたテーマデータソースから値を取得する。
・取得したテーマ値を解析し、正しい取得方法を自動検出する。
・正しい型(例えば、Material、Sprite、Image)の最終データ項目が自動検出された方法を用いて取得されます。

データ型

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

データタイプ 説明
AutoDetect(自動検出) 情報を解析し、正しい解釈を自動的に検出します
DirectValue 目的の型(例えば、Material、Sprite、Image)で直接使用します
DirectLookup ローカルの参照表から目的の値を検索する整数インデックスまたは文字列キー
StaticThemedValue 指定されたテーマのキーパスにあるテーマデータソースから正しい型の設定オブジェクトを取得します
ThemeKeypathLookup 整数インデックスまたは文字列キーを使用して目的のテーマキーパスを検索します
ThemeKeypathProperty テーマで指定されたテーマベースのキーパスに追加される文字列のプロパティ名です
ResourcePath Unityリソースから値を取得するためのリソースパス("resource://"で始まる場合がある)
FilePath Unityストリーミングアセットを取得するためのファイルパス("file://"で始まる場合がある)

データ型の自動検出(AutoDetect)

データ型の自動検出(AutoDetect)は受信したデータを解析し、自動的に検索方法を決定します。
下表での T はマテリアル、スプライト、イメージなど目的のデータ型を表しています。

自動検出はプロセス内で以下の2つの環境で発生することがあります。
・プライマリ情報の値
・プライマリ情報を介して取得されたテーマ設定値

データ型 備考 ヘルパーの有無 動作説明
T なし 有または無 テーマ無しで直接使用します
int 整数または Int32 無し T 型の N 番目のオブジェクトを取得するため派生した GetObjectByIndex(n) にインデックスとして渡されます
int 整数または Int32 有り ローカル検索から N 番目のテーマキーパスを取得して自動検出によりテーマオブジェクトを取得するためのインデックス
string "resource://{resourcePath}"形式 有または無 resourcePath を参照して Unity リソースを取得します
string "file://{filePath}"形式 有または無 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. 自動検出(AutoDetect)は "Resources/Sprites/sprite_cancelled" にあるリソースからアイコンを取得する必要があると判断します。

TextMeshPro スタイルシート

テーマ機能は TMPro スタイルシートを有効にすることができます。
"TMP Settings" ScriptableObjectは Resources のどこにスタイルシートがあるべきかを指示します。
これは [Default Font Asset => Path] プロパティです。

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

新しい UX コントロールを開発する場合、テーマ性を持たせるのは比較的簡単です。
他の UX コントロールで既に使用されているマテリアル、スプライトおよびその他の資産をコントロールで使用する場合、通常は各種のゲームオブジェクトに対して検出可能な方法で名前を付ける必要があります。

MRTK_UXCore_ThemeProfile を継承してテーマとなるフィールドを追加したり、コントロールを独自の ScriptableObject に関連付けたりすることができます。
ScriptableObject の構成によって、C# Reflectionを介して個々のデータ項目にアクセスするために必要なキーパスが決定されます。

新しいコントロールのトップレベルに BindingConfigurator.cs スクリプトを追加することによって、あなた自身の BindingProfile ScriptableObject を指定することができます。
このスクリプトはテーマ・プロファイルで提供されるデータとあなたのテーマ・エレメントを関連付けるために必要な GameObject 名とキーパスのマッピングを提供するものです。
このスクリプトは実行時に必要な DataConsumerXXX コンポーネントを自動的に追加して、使用したいテーマ設定をサポートします。