【Unity】MRTK導入してQuest2のハンドトラッキングでボタンを押す


MRTK-Quest

というツイートを見ました。

Quest2が発売されたということもあるので
MRTK×OculusQuest2×ハンドトラッキング
ボタンを押すところまでやってみようと思います。

バージョン情報

Unity 2019.4.8f1
Oculus Integration Version 20.1
Microsoft Mixed Reality Toolkit v2.5.0
MRTK-Quest v1.1.0

準備

まずはOculus IntegrationをAssetStoreからインポートします。

次にMicrosoft Mixed Reality Toolkitから必要なunitypackageを
ダウンロードしてプロジェクトにインポートします。

今回は、
Microsoft.MixedReality.Toolkit.Unity.Foundation
Microsoft.MixedReality.Toolkit.Unity.Tools
の2つを下記リンクからダウンロードします。

【リンク】:MixedRealityToolkit-Unity

インポートしたら初期設定画面が出ると思うので
Applyを押します。いろいろ必要な設定をやってくれます。

次にQuest対応のMRTK-Questを導入します。
下記からMRTK-Quest_v110_Core.unitypackage
をダウンロードしてインポートします。

【リンク】:MRTK-Quest


Profileの設定

最初にいろいろな設定が利用可能となるProfileを使える状態にします。

下記画像のように
Mixed Reality Toolkit > Add to Scene and Configure...
を選択すればOKです。

次にMRTK-QuestのProfileを使えるように下記画像のように設定します。


稀にProfileの設定ができないことがあります。(インポートの順番とかバージョンの違いかも)

うまくいかなかったら
下記のサンプルプロジェクトをクローンして
Profileがまとめられたファイルをプロジェクトに丸ごとコピーすれば大丈夫でした。

【リンク】:MRTK-Quest-Sample

Profileがまとめられたファイルのディレクトリは下記です。
MRTK-Quest-Sample\Assets\MRTK.ThirdParty\MRTK-Quest\Profiles


今回はやりませんが、ここまでいろいろダウンロードしたものは
manifest.jsonに自分で書き込めば勝手にインポートしてくれるらしいです。

【参考リンク】:MRTK 2.5 を Unity Package Manager を使って取り込む

【参考リンク】:Oculus Quest 2でMRTK使って豆腐と戯れる最小手順


ポインター、ゲイズ、テレポートを削除

下記はMRTK-Questのデモです。

引用元:MRTK-Quest

ただし、これは機能をてんこ盛りにしたバージョンのデモです。
今回は人差し指でボタンを押せる機能だけに絞りたいと思います。

ポインター削除

まずはポインターです。
MixedRealityToolkitInput設定から
下記画像のように不要なポインター機能を削除してPokePointerだけの状態にします。

ゲイズ削除

手の入力を検知するまでゲイズ(HMDの向きに照射されるポインター)が出ます。
これ正直なところどうやって消せばいいかいまいちわかりませんでした。
なのでオブジェクトを非アクティブにするというパワープレイで非表示にしました。

テレポート削除

MixedRealityToolkitTeleport設定からオフにできます。

ボタンを配置、常にカメラの前に表示する

ボタンはMixed Reality Toolkit > Toolboxから
下記画像のように選択できます。

Prefabを直接Hierarchyに置いてもOKです。

表示位置を調整してデバッグするのが面倒なので
常にカメラの前に表示します。下記にまとめたScriptを使用します。
【参考リンク】:【Unity(C#)】Lerp、Slerpを使った減速表現

デバッグ

ここまででもう下記動画のようにボタンは押せるようになっているはずです。

Editor上でも確認できます。下記にまとめてます。
【参考リンク】:【Unity】Oculus Link使ってEditor上でデバッグ

実機での確認は(ビルドの設定は省いて)1つ設定しなければならない箇所があります。
下記画像の通り、Hands Onlyにする必要があります。

設定用ConfigのディレクトリはAsset/oculus/OculusProjectConfigです。

ボタンに処理を追加する

ボタンを押すとキューブの表示が切り替わるデモです。

コード

using Microsoft.MixedReality.Toolkit.UI;
using UnityEngine;

/// <summary>
/// ボタン押下時のイベントを管理
/// 適当なオブジェクトにアタッチ
/// </summary>
public class ButtonEventManager : MonoBehaviour
{
    /// <summary>
    /// ボタン
    /// </summary>
    [SerializeField] private Interactable _interactableButton;

    [SerializeField] private GameObject _cube;

    void Start()
    {
        _interactableButton.OnClick.AddListener(() =>
        {
            //ボタン押下時行いたい処理
            _cube.SetActive(!_cube.activeInHierarchy);
        });
    }
}

MRTKのボタンにInteractableというコンポーネントがついているので
その中のリスナーにイベント登録しています。

おわりに

VRで物理的なUIを一から自分で作るのは面倒なので
これからもお世話になろうと思います。

参考リンク

Oculus Quest 2でMRTK使って豆腐と戯れる最小手順
手乗りちょまぎょアプリ開発で学ぶ MRTK 入門 (MRTK 2.5 対応)