MRが楽しい

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

MRTKv2.xでオブジェクトを両手でポイントして移動・回転・拡縮する その4(掴むオブジェクトの優先度を設定する)

本日はMRTKv2.xの小ネタ枠です。
MRTKv2.xでオブジェクトを両手でポイントして移動・回転・拡縮する方法を記事にします。
今回は掴むオブジェクトの優先度を設定する方法についてです。

前回記事

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

掴むオブジェクトの優先度を設定する

MRTKのポインター機能ではレイヤーごとに優先度を設定できます。
以下のサンプルシーンを作成しました。

2つのDefaultレイヤーで設定された掴み操作可能なオブジェクトを配置しています。

この状態では当然手前にあるCubeオブジェクトが優先してポイントされ、掴むことができます。

今回はCubeオブジェクトの背後にあるSphereオブジェクトを優先的に掴めるよう設定を行ってみます。

優先するレイヤーを作成する

初めに優先度の高いオブジェクトを識別するためのレイヤーを作成します。
Inspectorビューの[Layer]プルダウンから[Add Layer..]を開きます。

識別用のレイヤーを任意の空きレイヤーに名前を入力して登録します。
今回は Priority Layer という名前のレイヤーを追加しました。

Sphereオブジェクトを優先できるように、SphereオブジェクトのレイヤーをPriority Layerに変更します。
Inspectorビューの[Layer]プルダウンからレイヤーを選択できます。

プロファイルを編集できるようにする

ポインターの優先度の設定はMixedRealityToolkitオブジェクトに設定されているMRTKのプロファイルから行います。
デフォルトのプロファイルは変更できないため、[Copy & Customize]して複製します。

更に[Input]タブのプロファイルを編集するため、こちらのプロファイルも[Clone]して複製します。

[Pointers]パネルのプロファイルを編集するため、プロファイルを[Clone]して複製します。

これでポインターの設定を変更できるようになりました。

因みに先ほど追加したレイヤーは自動でポインターの対象レイヤーに追加されています。
この状態では既存レイヤーも追加レイヤーも同じ優先度でポイントされます。

ポインターの優先度を変更する

ポインターの優先度を変更してPriority Layerレイヤーを優先的にポイントするようにします。
掴み操作で利用されるポインターの優先度は[ShellHandRayPointer]の[Pointer Raycast LayerMasks]の設定が参照されます。

ただし本設定は[Default Raycast LayerMasks]の設定を参照するようになっているため、直接編集できない点に注意が必要です。
[Default Raycast LayerMasks]の[+]ボタンを押して項目を追加すると、[ShellHandRayPointer]側の設定も更新されます。

レイヤーの優先度は上から順にチェックが行われます。
[Element 0]のレイヤーをPriority Layerのみに変更することで、Priority Layerを優先的に利用するようになります。

その他のポインター設定についても[Default Raycast LayerMasks]を参照するものは自動で同じ設定に更新されます。
ポインターによっては個別に設定が必要なものもあるので注意してください。

これで設定は完了です。

動作確認

シーンを再生して動作を確認します。
CubeオブジェクトとSphereオブジェクトが一直線上に重なる箇所をポイントして掴み操作を行います。

すると背後のSphereオブジェクトが優先され、掴むことができます。
以下の通り、Cubeオブジェクトの背後にあるSphereオブジェクトを移動できました。

優先度の高いオブジェクトが重なっていないときは既存のオブジェクトを掴むことができます。
CubeオブジェクトとSphereオブジェクトが重ならない箇所をポイントして掴み操作を行います。

以下の通り、DefaultレイヤーのままのCubeオブジェクトを掴んで移動することができました。