UnityでOculus Quest(オキュラス クエスト)のコントローラをアプリ内に表示する方法とコントローラー入力を取得する方法についてご紹介します。
Oculus Touchコントローラーはタッチセンサーが搭載されているのでボタン押下以外にもタッチしたときのイベントも取得できます。
UnityでOculus Quest用のアプリをビルドするまでの手順や設定などについてはこちらをご確認ください。
Oculus Touch コントローラーの表示
最初にシーンにデフォルトで存在する、MainCameraを削除します。
シーンに Oculus > VR > Prefabs 内にある「OVRCameraRig」を追加します。
シーンに追加した「OVRCameraRig」を選択して、Inspectorウィンドウを表示します。
「OVR Manager(Script)」のTarget Devices > Quest にチェックが入っていることを確認してください。
次に、シーンに配置した「OVRCameraRig」オブジェクトの中身を展開していき、以下の2つのオブジェクトを表示しておきます。
- OVRCameraRig > TrackingSpace > LeftHandAnchor > LeftControllerAnchor
- OVRCameraRig > TrackingSpace > RightHandAnchor > RightControllerAnchor
Oculus > VR > Prefabs 内にある「OVRControllerPrefab」プレハブを「LeftControllerAnchor」と「RightControllerAnchor」それぞれにドラッグ&ドロップで追加します。
追加した左右のコントローラプレハブ「OVRControllerPrefab」の設定を変更します。
まずは左手用コントローラの設定です。
シーンに存在する OVRCameraRig > TrackingSpace > LeftHandAnchor > LeftControllerAnchor > OVRControllerPrefabのInspectorウィンドウで「OVR Controller Helper(Script)」の「Controller」を「L Tracked Remote」に設定してください。
同様に右手用コントローラの設定を行います。
シーンに存在する OVRCameraRig > TrackingSpace > RightHandAnchor > RightControllerAnchor > OVRControllerPrefabのInspectorウィンドウで「OVR Controller Helper(Script)」の「Controller」を「R Tracked Remote」に設定してください。
ここまでの変更で実行してみると以下のような実行画面になります。
Oculus Touch コントローラーの入力を取得する
ボタン押下の取得
以下のようなプログラムで各ボタンを押しているかどうか取得することができます。
if (OVRInput.Get(OVRInput.RawButton.A)) { //Aボタンを押しているとき } if (OVRInput.Get(OVRInput.RawButton.B)) { //Bボタンを押しているとき } if(OVRInput.Get(OVRInput.RawButton.X)) { //Xボタンを押しているとき } if (OVRInput.Get(OVRInput.RawButton.Y)) { //Yボタンを押しているとき } if (OVRInput.Get(OVRInput.RawButton.RIndexTrigger)) { //右人差し指トリガーを押しているとき } if (OVRInput.Get(OVRInput.RawButton.RHandTrigger)) { //右中指トリガーを押しているとき } if (OVRInput.Get(OVRInput.RawButton.LIndexTrigger)) { //左人差し指トリガーを押しているとき } if (OVRInput.Get(OVRInput.RawButton.LHandTrigger)) { //左中指トリガーを押しているとき }
上記の「OVRInput.Get」関数のほかに、
「OVRInput.GetUp」「OVRInput.GetDown」関数があり、それぞれ「今、ボタンを押した」「今、ボタンを離した」などのボタンの状態が取得できます。
ボタンタッチの取得
中指トリガー以外のボタンはタッチセンサーがあり、ボタンをさわったかどうかも取得できます。
プログラムは以下のように記述します。
if (OVRInput.Get(OVRInput.RawTouch.A)) { //Aボタンをタッチしてるとき } if (OVRInput.Get(OVRInput.RawTouch.B)) { //Bボタンをタッチしてるとき } if (OVRInput.Get(OVRInput.RawTouch.X)) { //Xボタンをタッチしてるとき } if (OVRInput.Get(OVRInput.RawTouch.Y)) { //Yボタンをタッチしてるとき } if (OVRInput.Get(OVRInput.RawTouch.RIndexTrigger)) { //右人差し指トリガーをタッチしてるとき } if (OVRInput.Get(OVRInput.RawTouch.LIndexTrigger)) { //左人差し指トリガーをタッチしてるとき }
アナログスティック値の取得
Oculus Touchコントローラのアナログスティックをどれくらい倒しているかを数値で取得することができます。
取得できる数値の範囲は-1~1で、何もさわっていない状態で0が取得できます。
プログラムは以下のように記述します。
Vector2 vectorR = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick); Vector2 vectorL = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick);
サンプルアプリ
Oculus Touchの入力取得のサンプルに以下を作成しました。
ボタンタッチしたときは黄色
ボタンを押したときは赤色
一番下にはアナログスティックの値を表示しています。
ソースコード
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ContollerEvent : MonoBehaviour { // 確認用GameObject public SpriteRenderer A; public SpriteRenderer B; public SpriteRenderer IndexR; public SpriteRenderer MiddleR; public TextMesh StickR; public SpriteRenderer X; public SpriteRenderer Y; public SpriteRenderer IndexL; public SpriteRenderer MiddleL; public TextMesh StickL; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { // ボタン状態取得 CheckButton(OVRInput.RawButton.A, OVRInput.RawTouch.A, A); CheckButton(OVRInput.RawButton.B, OVRInput.RawTouch.B, B); CheckButton(OVRInput.RawButton.X, OVRInput.RawTouch.X, X); CheckButton(OVRInput.RawButton.Y, OVRInput.RawTouch.Y, Y); CheckButton(OVRInput.RawButton.RIndexTrigger, OVRInput.RawTouch.RIndexTrigger, IndexR); CheckButton(OVRInput.RawButton.LIndexTrigger, OVRInput.RawTouch.LIndexTrigger, IndexL); CheckButton(OVRInput.RawButton.RHandTrigger, MiddleR); CheckButton(OVRInput.RawButton.LHandTrigger, MiddleL); // アナログスティック値取得 Vector2 vectorR = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick); Vector2 vectorL = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick); StickR.text = string.Format("({0:0.00},{1:0.00})", vectorR.x, vectorR.y); StickL.text = string.Format("({0:0.00},{1:0.00})", vectorL.x, vectorL.y); } private void CheckButton(OVRInput.RawButton button, OVRInput.RawTouch touch, SpriteRenderer spRender) { if (OVRInput.Get(button)) { // ボタンを押しているとき spRender.color = Color.red; } else if (OVRInput.Get(touch)) { // ボタンをタッチしているとき spRender.color = Color.yellow; } else { // ボタンを押してもタッチもしていないとき spRender.color = Color.white; } } private void CheckButton(OVRInput.RawButton button, SpriteRenderer spRender) { if (OVRInput.Get(button)) { // ボタンを押しているとき spRender.color = Color.red; } else { // ボタンを押していないとき spRender.color = Color.white; } } }
参考:
https://developer.oculus.com/documentation/unity/latest/concepts/unity-ovrinput/
コメント
[…] 【Oculus Quest】UnityでOculus Touchコントローラーを使用するUnityでOculus Quest(オ… […]