本日は MRTKv2 の調査枠です。
MRTKv2 の Guides ドキュメントを少しずつ読み進めていきます。
MRTKv2のGuidesドキュメント
以下のドキュメントを読み進めていきます。
microsoft.github.io
以下のページでは有志による本ドキュメントの日本語翻訳が行われています。
投稿時点でこちらで未翻訳、または著者が興味のある部分について記事にしていきます。
hololabinc.github.io
本記事では以下のページを読み進めます。
microsoft.github.io
MRTKでNearInteractionを追加する方法
タッチ操作を追加する
UnityUI 要素にタッチインタラクションを追加するプロセスは標準的な 3D GameObjects とは異なります。
UnityUI コンポーネントを有効にするために、次の UnityUI のセクションにスキップできます。
ただし、両方のタイプのUX要素については PokePointer が Pointer プロファイルに登録されていることを確認してください。
デフォルトの MRTK プロファイルとデフォルトの HoloLens2 プロファイルには PokePointer が含まれています。
MRTK構成プロファイルを選択し、[Input] > [Pointers] > [Pointer Options] に移動して、PokePointer が作成されることを確認できます。
MRTK.SDK/Features/UX/Prefabs/Pointers/の配下の PokePointer プレハブが、[Controllered Type]を[Articulated Hand]に設定した状態で追加されていることを確認します。
または PokePointer クラスを実装しているカスタムプレハブを利用できます。
3D GameObjects
タッチ可能にする必要がある GameObject で、コライダーと NearInteractionTouchable コンポーネントを追加します。
コンポーネントスクリプトで IMixedRealityTouchHandler インターフェイスを使用する場合は、[Event to Receive]を[Touch]に設定します。
その後、[Fix bounds]と[Fix Center]をクリックします。
GameObject またはその親で IMixedRealityTouchHandler インターフェイスを実装するスクリプトコンポーネントを追加します。
NearInteractionTouchable を持つオブジェクトの親もポインターイベントを受け取ることができます。
注意
NearInteractionTouchable が設定された GameObject が選択されたエディターシーンビューで、白いアウトラインの正方形と矢印に注目してください。
矢印はタッチ可能オブジェクトの「前面」を指します。衝突可能オブジェクトはその方向からのみタッチ可能になります。
コライダーを全ての方向からタッチ可能にするには代わりに NearInteractionTouchableVolume を追加します。
Unity UI
シーンにUnityUIキャンバスがあることを追加/確認します。
タッチ可能にしたい GameObject で NearInteractionTouchableUnityUI コンポーネントを追加します。
コンポーネントスクリプトで IMixedRealityTouchHandler インターフェイスを使用する場合は、[Event to Receive]を[Touch]に設定します。
GameObject またはその親で IMixedRealityTouchHandler インターフェイスを実装するスクリプトコンポーネントを追加します。
NearInteractionTouchableUnityUI を持つオブジェクトの親もポインターイベントを受け取ることができます。
タッチコードの例
以下のコードは NearInteractionTouchable バリアントコンポーネントを使用して GameObject にアタッチし、タッチ入力イベントに応答できる MonoBehaviour を示しています。
public class TouchEventsExample : MonoBehaviour, IMixedRealityTouchHandler { public void OnTouchStarted(HandTrackingInputEventData eventData) { string ptrName = eventData.InputSource.SourceName; Debug.Log($"Touch started from {ptrName}"); } public void OnTouchCompleted(HandTrackingInputEventData eventData) {} public void OnTouchUpdated(HandTrackingInputEventData eventData) { } }