1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MRTK3を使用してVR開発をする上で詰まったこと・注意すべきことをまとめてみる

Posted at

はじめに

先日、ヤフー株式会社様主催のOpen Hack U Spring OSAKA に所属するITコミュニティのメンバーとともに参加しました。私たちのチームはVR・ARを用いたゲームアプリを作成することになり、私はVR側を担当し、MRTK3というフレームワークを使用したのですが、参考記事が多いわけではなかったので、いくつか詰まった点や気を付けるべき点を備忘録も兼ねてまとめようと思います。

開発環境

名前 バージョン
Unity 2021.3.7f1
VRデバイス Meta(Oculus) Quest 2

そもそもMRTK3とは?

MRTK3 は、Unity 用 Microsoft Mixed Reality ツールキットの第 3 世代にあたるものです。「Mixed Reality」と付いていることから分かるように本来はMRに使用されるものですが、VRでも活用が可能です。MRTK3の特徴として、豊富なUIとUIの見た目がリッチである点が挙げられます。MRTK3に関する細かい内容は下記のサイトを参照してください。

Mixed Reality ツールキット 3 開発者向けドキュメント - MRTK3

MRTK3の導入

MRTK3の導入自体は本題ではないので、この記事では割愛させていただきます。MRTK3を組み込んだ新規プロジェクトの立ち上げ方と既存のプロジェクトにMRTK3を組み込む方法は下記の記事がとても参考になります。

それでは、導入後詰まった点や注意すべきだと感じた点を列挙していきます。

1. MRTK XR RigとOVR Camera Rigは併用するのは避ける

 UnityでVR開発をする方法を載せている記事はいくつか見受けられますが、VR空間上での視点変更や移動、コントローラーの表示などをするためにOVRCameraRigを使用しているものがあります。
 MRTK3を使用しない場合は全く問題ないのですが、MRTK3で使われるカメラリグであるMRTK XR Rigと併用するとコントローラーから延びるレーザーポインターがものすごくブレる現象に直面しました。ブレるだけならまだよいのですが、UIを操作しようとすると、自分が押そうとしているボタンの隣のボタンにレーザーポインターが吸い寄せられるという謎の挙動に苦しめられました...

 それでもOVRCameraRigを使用しないとやりたいことができない!という方はOVR Managerというスクリプトを移植することでだいたいのことはできるようになります。(コントローラーの入力の取得など)

2. ボタンの長押しはRayCastを併用することで実現する。

 通常、2Dや3Dのゲームを作成する際に長押しの処理をしたい場合は、Event Triggerコンポーネントを使用すると思います。しかし、MRTK3のUIは一般的なuGUIを使用しているわけではないのでEvent Triggerで長押しの処理をしても機能しません。
 また、VRではコントローラーの入力をOVRInputのメソッドを呼び出すことで取得すると思いますが、用意されている長押しを検知するメソッド【OVRInput.Get(...)】ではボタンのあるなしに関係なく呼び出されるため、これ単体ではボタンの長押し処理は実現できません。
 そこで、これらの解決策としてRayCastを併用することで長押しの機能を正しく実装できます。

以下は左右のトリガーで長押しの操作をするサンプルスクリプトです。

LongPressSample
private void Update() 
{
    //左右トリガーの入力を検知する。
    if(OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger, OVRInput.Controller.LTouch) || OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger, OVRInput.Controller.RTouch))
    {
        //コントローラーの向いている方向にレイを飛ばす
        Ray ray = new Ray(rightController.transform.position, rightController.transform.forward);
        RaycastHit hit;
        if(Physics.Raycast(ray, out hit))
        {
            //タグでどのボタンを長押ししているかの判別
            if(hit.collider.gameObject.CompareTag("Button"))
            {

                //長押しをしたときの処理

            }
        }
    }
}

上記のスクリプトでは、必ず長押しの処理をタグ等でどのボタンオブジェクトで行っているかを確認しているif文の中で行ってください。この確認がないと別のボタンオブジェクトで処理が実行されてしまう可能性があります。

3. MRTKのインプットシステムが一部正しく設定されていない

この不具合は私だけかもしれませんが、一度確認しておくことを推奨します。

 開発途中、右のスティックで移動できるようにしようと考え、MRTKのインプットシステムを利用して作成していたのですが、いざビルドしてみると右のコントローラーのスティックが反応しない...左のスティックは反応するのになぜだ!!...となり、調べてみるとMRTKのInput Actionで右のコントローラーのMoveに三角形がついていない!つまり、Moveの項目に何も設定されていないことに気が付きました。

image.png

ただ、これの対処法はシンプルで左のコントローラーにもMoveの項目があり、そちらは正しく設定されているので設定を真似れば大丈夫です。具体的には下のようになります。

image.png

終わりに

今回はMRTK3を使ってVR開発を行った際に詰まった点・注意すべき点をまとめました。今後、MRTK3を使用した際に他に注意すべき点など見つかれば追記していきたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?