今回はUnityでVRを体験してみます。
VRといってもプレイステーションやオキュラスのような本格的な
ものではなく、スマホと専用のゴーグルを利用するVRです。
こんなやつです。
仕組みとしてはちょっとずれた画像を右目と左目に見せることで
実際に目の前に存在しているかのように見せることができるというものです。
一見すると作るのが難しそうに思えますが、Googleがこのダンボールで
できたゴーグル(Cardboard)のSDKを公開していて、比較的
簡単に下のようなVRのアプリケーションを作成することができます。
ということで今回はUnityからCardboardのSDKを利用してアプリを作成します!
まずは準備です。
1.ユニティでVR制作|VRを有効にする
unityのplayerセッティングを開き、XRの設定からVRを有効にします。
2.ユニティでVR|GVR SDK for Unityをインポートする
GVR SDK for UnityをダウンロードしてUnityにインポートします。
3.とりあえずVRの動作確認をする
SDKがちゃんとインポートされたかまずは確認してみます。
先ほどインポートしたGVR SDK for Unityの中にGvrEditorEmulator
というprefabがあるので、それをヒエラルキーウィンドウに配置します。
配置が完了したらとりあえず実行してみましょう。
altキーを押しながらマウスを動かした時、画面がマウスの動きに合わせて
移動すればOKです。
動いているかわかりにくい場合は立方体等を近くに置いてあげると
動きが確認しやすいです。
また、この段階では画面が2つに分かれず、失敗した。と思う方がいるかも
しれませんが、スマホの実機で動作させるとちゃんと2つに分割されるので
安心してください。
4.VRに視線入力処理を入れる
次はVRでの入力を作成します。VRはゴーグルにスマホをセットするため、
指でのタッチ入力ができません。
そのため、リモコンや目線で入力する必要があります。
今回は目線の入力を利用しますが、その前にやることがあります。
視線を表すポインタは、標準で白色のため、わかりやすいように
白色のオブジェクトは白以外の色に変更しておきましょう。
それでは必要部品機能をヒエラルキーに置いていきます。
・GvrEventSystemをヒエラルキーに配置する。
これを配置することで視点と対象物が重なると処理を呼び出すことができます。
・メインカメラの子にGvrReticlePointerを配置する。
目線を表すポインタを点で表示します。
配置が完了したら、次はコンポーネントの設定です。
・対象のオブジェクトにcolliderを設定する。
視点との当たり判定にcolliderが必要になります。
・対象のオブジェクトにイベントトリガーを追加する。
イベントを追加することで視線と重なった時に特定の処理
を呼び出すことができます。
視線が重なった時(Pointer Enter)
視線が外れた時(Pointer Exit)
・メインカメラにPhysics Raycasterを設定する。
視線からRayを飛ばし、対象のオブジェクトに当たっているか判断するものです。
当たり判定にひつようなコンポーネントです。
ここまできたら実際に動作を確認してみます。
対象の立方体に視点があった際に丸い円が表示されていればOKです。
うまく動作したでしょうか。
このように、VRの表示、処理の呼び出し方を簡単に実施することができました。
冒頭で出したUnityちゃんのVRは、Unityちゃんを3秒間見つめると歩き出すというものですが、
これまでに説明した内容を用いて次のように簡単に作ることができます。
1.Unityちゃんを見つめた場合秒数をカウントする
2.3秒マウス視点と重なっている場合はアニメーションのパラメータを変更して歩かせる
3.Unityちゃんの進行方向に力を加える(動かす)
4.視点が外れた場合はアニメーションのパラメータを変更して止める
5.タイマーを戻す
5つも手順があり、複雑に思えるかもしれませんが、各処理ではパラメータの変更を
行なっているだけでとえも簡単です!
なお、実際のプログラムは次のように書いています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class unitychanMain : MonoBehaviour { Animator animator; // アクションを変えるまでの時間 public float actionChangeTime = 3f; //タイマー float timer; // 視線が捉えているか bool eyeEnter; //flag bool flag = false; Vector3 force; //rigidbody Rigidbody rb; // Start is called before the first frame update void Start() { animator = GetComponent<Animator>(); timer = actionChangeTime; eyeEnter = false; rb = this.GetComponent<Rigidbody>(); force = new Vector3(0.0f, 0.0f, -8.0f); // 力を設定 } // Update is called once per frame void Update() { if (eyeEnter) { timer -= Time.deltaTime; if (timer < 0) { timer = actionChangeTime; animator.SetFloat("Speed", 0.1f); flag = true; } } } private void FixedUpdate() { if (flag) { rb.AddForce(force); // 力を加える } } //視線が入った場合 public void EnterToTarget() { eyeEnter = true; } //視線が入った場合 public void OutToTarget() { eyeEnter = false; flag = false; timer = actionChangeTime; animator.SetFloat("Speed", 0.0f); } } |
今回は視線を重ねると何らかのイベントを発生させるという簡単なサンプルで
VRの実装方法を書いていきましたが、これを応用すれば、VR脱出ゲームや、
VRでシューティングゲームも簡単に作れそうですね。
今回の内容であれば、お手軽に試すことができるのでぜひ一度試してみてください!