MRが楽しい

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

MRTK v2のドキュメントを少しずつ読み解く MRTKでNearInteractionを追加する方法 その2

本日は MRTKv2 の調査枠です。
MRTKv2 の Guides ドキュメントを少しずつ読み進めていきます。

MRTKv2のGuidesドキュメント

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

以下のページでは有志による本ドキュメントの日本語翻訳が行われています。
投稿時点でこちらで未翻訳、または著者が興味のある部分について記事にしていきます。
hololabinc.github.io

本記事では以下のページを読み進めます。
microsoft.github.io
f:id:bluebirdofoz:20200311095231j:plain

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 クラスを実装しているカスタムプレハブを利用できます。
f:id:bluebirdofoz:20200311095246j:plain

3D GameObjects

タッチ可能にする必要がある GameObject で、コライダーと NearInteractionTouchable コンポーネントを追加します。

コンポーネントスクリプトで IMixedRealityTouchHandler インターフェイスを使用する場合は、[Event to Receive]を[Touch]に設定します。
その後、[Fix bounds]と[Fix Center]をクリックします。
f:id:bluebirdofoz:20200311095258j:plain

GameObject またはその親で IMixedRealityTouchHandler インターフェイスを実装するスクリプトコンポーネントを追加します。
NearInteractionTouchable を持つオブジェクトの親もポインターイベントを受け取ることができます。

注意

NearInteractionTouchable が設定された GameObject が選択されたエディターシーンビューで、白いアウトラインの正方形と矢印に注目してください。
矢印はタッチ可能オブジェクトの「前面」を指します。衝突可能オブジェクトはその方向からのみタッチ可能になります。
コライダーを全ての方向からタッチ可能にするには代わりに NearInteractionTouchableVolume を追加します。
f:id:bluebirdofoz:20200311095415j:plain

Unity UI

シーンにUnityUIキャンバスがあることを追加/確認します。

タッチ可能にしたい GameObject で NearInteractionTouchableUnityUI コンポーネントを追加します。

コンポーネントスクリプトで IMixedRealityTouchHandler インターフェイスを使用する場合は、[Event to Receive]を[Touch]に設定します。

GameObject またはその親で IMixedRealityTouchHandler インターフェイスを実装するスクリプトコンポーネントを追加します。
NearInteractionTouchableUnityUI を持つオブジェクトの親もポインターイベントを受け取ることができます。

重要

NearInteractionTouchable スクリプトコンポーネントの[Events to Receive]プロパティには2つのオプションがあります。
オプションは Pointer と Touch です。

入力イベントに応答/処理するコンポーネントスクリプトで IMixedRealityPointerHandler インターフェースを使用する場合は Pointer に設定します。
または IMixedRealityTouchHandler インターフェースを使用する場合は Touch に設定します。

タッチコードの例

以下のコードは 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) { }
}

f:id:bluebirdofoz:20200311095651j:plain