【Unity(C#)】OculusQuestのハンドトラッキングでボタンを押す


Oculus Integration

この記事内ではOculus Integrationの使用を前提に話を進めていきます。

Oculus Integration内のコード自体は
私レベルでは理解不能なことをいっぱいやっていますが、
パーツを部分的に使用すれば本当に使いやすくなっているのが
今回使ってみて改めてよくわかりました。

ありがとうOculus。
(贅沢言えばハンドジェスチャーのステートとかほしい、、、)

デモ

作成中のお絵描きアプリでRedo,Undo機能の呼び出しにボタンを使いました。

準備

下記リンクを参考に、デモシーンからボタンをパクってきていろいろ設定します。

【参考リンク】:Oculus Quest ハンドトラッキングを試してみた

コード

一部を抜粋して貼ります。

        [SerializeField] private ButtonController _redoButtonObj, _undoButtonObj, _paintButtonObj;

        private HpPaintFunctionState _paintFunctionState;

        private void Start()
        {
            //Redoボタンが押されたらFunctionステートを変更
            _redoButtonObj.InteractableStateChanged.AddListener(modeChangeToRedo);

            //Undoボタンが押されたらFunctionステートを変更
            _undoButtonObj.InteractableStateChanged.AddListener(modeChangeToUndo);

            //Paintボタンが押されたらFunctionステートを変更
            _paintButtonObj.InteractableStateChanged.AddListener(modeChangeToPaint);
        }


        /// <summary>
        /// Redoモードに変更
        /// </summary>
        /// <param name="obj">リスナー登録時に必要な引数</param>
        private void modeChangeToRedo(InteractableStateArgs obj)
        {
            if (obj.NewInteractableState == InteractableState.ActionState)
            {
                _paintFunctionState = HpPaintFunctionState.Redo;
            }
        }

        /// <summary>
        /// Undoモードに変更
        /// </summary>
        /// <param name="obj">リスナー登録時に必要な引数</param>
        private void modeChangeToUndo(InteractableStateArgs obj)
        {
            if (obj.NewInteractableState == InteractableState.ActionState)
            {
                _paintFunctionState = HpPaintFunctionState.Undo;
            }
        }

        /// <summary>
        /// Paintモードに変更
        /// </summary>
        /// <param name="obj">リスナー登録時に必要な引数</param>
        private void modeChangeToPaint(InteractableStateArgs obj)
        {
            if (obj.NewInteractableState == InteractableState.ActionState)
            {
                _paintFunctionState = HpPaintFunctionState.Paint;
            }
        }

InteractableState.ActionStateという状態になっていれば
各機能(Redo,Undo,Paint)へ切り替わる
という関数を
それぞれのボタンのステートが切り替わった際に実行されるイベントとして登録しています。

まとめ

ButtonControllerInteractableStateChanged
 イベントを登録することでステート変化時に任意の処理が実行可能。

・登録するイベントにはInteractableStateArgsを引数で渡して
 どのステートからどのステートに移行したかに応じた処理が書ける。