Google VR for Unityに同梱されているGVRDemoを参考に、Daydreamのコントローラ操作を実装してみました。
本当はだいぶ前にやったんですが、ARCoreとか他のプラットフォームをいじっていたので、このタイミングで一旦まとめ。
開発環境
UnityおよびSDKのバージョンは以下です。
- Unity5.6.2f1
- GVR Unity SDK v1.70.0
シーンの構成
GoogleVR/Prefabsから必要なPrefabを配置します。
GvrEditorEmulator.prefab
Unityエディタのエミュレータで視線変更を行うためのPrefabです。
シーンに配置することで、Alt+マウスコントロール、Ctl+マウスコントロールによるカメラの回転ができます。
実機での動作には、特に影響ありません。
Utilities/GvrFPSCanvas.prefab
配置すると画面上にFPSを表示してくれるPrefabです。
スマートフォンVRでのFPSは気になるので、開発時に表示させておくとよいと思います。
Controller/GvrControllerMain.prefab
Daydreamコントローラとの接続を行うためのPrefabです。
Unityエディタ上では、Controller Emulatorアプリが利用でき、"USB"または"WIFI"の接続設定が行えます。
※Controller Emulatorについては、過去の記事を参照。
UI/GvrControllerPointer.prefab
コントローラが指している方向をポインタ表示してくれるPrefabです。
UI/GvrEventSystem.prefab
コントローラを操作した際にイベントを発行してくれるPrefabです。
Pointer Clickイベントの実装
まず、カメラにGvrPointerPhysicsRaycasterをアタッチします。
これを忘れると、Pointer Clickイベントが取れません。
クリック対象のオブジェクトには、Rayの衝突を検知するCollider、イベント発生時に実行するScript、Event Triggerをアタッチします。
Event Triggerの"Add New Event Type"をクリックするとイベントの一覧が表示されるので、"PointerClick"を選択します。
Event TriggerにPointer Clickイベントが追加され、スクリプトの関数を紐付けられるようになります。uGUIでボタンに処理を紐付けるやり方と同じです。
GVRDemoではPointerの操作でCubeのテクスチャの色を変えたり、位置を移動させたりしていましたが、自作のデモではクエリちゃんmodel SD版を使い、キックモーションを実行するようにしました。
実際に追加したスクリプトは以下で、PointerClickイベント発生時にOnPointerClick()を実行しています。
using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(Collider))] public class QueryController : MonoBehaviour { private QuerySDMecanimController m_mecanimController; void Start () { m_mecanimController = GetComponent<QuerySDMecanimController> (); } public void OnPointerClick(){ m_mecanimController.ChangeAnimation (QuerySDMecanimController.QueryChanSDAnimationType.BLACK_KICK); } }
デモ実行
上記のシーンをUnityエディタ上で実行した動画です。
DaydreamのPointer Clickデモ。
— jyuko (@jyuko49) 2017年9月13日
ブラッククエリの回し蹴りモーションがかっこいい! pic.twitter.com/h1oZg4mF2i
コントローラを動かすとポインタが動き、対象オブジェクトにポインタの光が当っている状態でタッチパッドをクリックすると、Pointer Clickイベントが実行されます。
実機(Zenfone AR)+Daydream View+コントローラでも動作は確認済みです。
Unityエディタ上ではFPSが出ていませんが、実行しているMac Bookが古いだけなので実機では60FPS出ています。
まとめ
Google VR for UnityのPrefabsを利用すれば、簡単なポインタ操作はすぐに実装できます。
Pointer Clickで動作するUIやシューティングゲームであれば、これだけでも十分動かせると思います。
とはいえ、インターフェースとしては物足りない感じなので、Daydream Elementsを参考に、よりリッチな空間UIを実装できるようにしたいところです。