前回は「Apple Watchを動かしてみよう!」のサンプルアプリケーションを作成してみようでした。
今回はUnityとOculusの連携でタップ判定の取得についてを紹介します。
OculusだけでUI画面の操作をどうやったらできるか疑問に思ったことがきっかけでした。調査していくなかで加速度を使用して、本体が加速した(揺れた)ときの値を取れることがわかりました。これだけだと首をふったりなどの動きでも加速度とれてしまうのでそれらを加味した上で手でOculusをたたいた時(タップ)の判定を取るようにしていきます。
はじめに、Oclus用のカメラが接続されている前提で進めていきます。
用意していない方はこちら
判定用のためにカーソルを追加します。
Cunvasを追加し、その子にCursorという名前でオブジェクトを配置します。
新しく今回あたり判定のオブジェクトを配置します。
Cubeを追加し、Objectという名前にします。
次にタップを検出する用のスクリプトを作成していきます。
using UnityEngine; using System.Collections; using VR = UnityEngine.VR; public class TapController : MonoBehaviour { //判定用のカーソルの親を設定 public Transform centerPos; float x_bk = 0.0f; float y_bk = 0.0f; float z_bk = 0.0f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { //Unity5.1からVRが対応されました。 //InputTrackingで現在の位置、角度が取得できます。 Vector3 ts = VR.InputTracking.GetLocalPosition(VR.VRNode.Head); //本体の加速度を取得するクラスです。 OVRDisplay ovrd = new OVRDisplay (); //オブジェクトの衝突判定をする RaycastHit hit; //加速度の検出 if (Mathf.Abs (ovrd.acceleration.x) >= 4.0f || Mathf.Abs (ovrd.acceleration.y) >= 4.0f || Mathf.Abs (ovrd.acceleration.z) >= 4.0f) { //上下左右振り向いた時の判定 if (0.01 >= Mathf.Abs (ts.x - x_bk) && 0.01 >= Mathf.Abs (ts.y - y_bk) && 0.01 >= Mathf.Abs (ts.z - z_bk)) { if( Physics.Raycast( centerPos.transform.position,centerPos.transform.forward, out hit )) { if (hit.transform.name == "GameObject") { Debug.Log("hit.transform.name:::" + hit.transform.name); } } } x_bk = ts.x; y_bk = ts.y; z_bk = ts.z; } } }
上記のスクリプトをEventSystemを追加し、ドラッグします。
CenterEyeAnchorをcenterPosにドラッグします。
それでは再生してみましょう。
今回はタップ判定のみとなりましたが
今後はボタンの判定にも挑戦したいと思います。
最後までご覧いただきありがとうございます。
弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。