今回のハンズオンでやること
- GearVRアプリのビルド
- 視線で選択する
- タッチパッドで入力する
- GearVRコントローラーを使う
- コントローラーで指して選ぶ
- コントローラーのボタンを使う
事前準備
Unityのインストール
Unity5.6.2をインストールして下さい
Androidビルド環境の構築
こちらが参考になります。ビルドしてapkファイルを出力できるところまで確認お願いします。
https://techacademy.jp/magazine/2229
【1】Gear VRアプリをビルドしてみよう
サンプルアセットのインストール
Unity Technorogy謹製のVR Samplesというアセットを使います。
https://www.assetstore.unity3d.com/jp/#!/content/51519
全部インポートするとかなり重いので、今回は
VRSampleScenes > Textures > Menu
のチェックを外して下さい。
サンプルを実機向けにビルドしてみる
signatureファイルの設定
ストア公開前のGear VRアプリを実機で試すためには、apkビルド時に端末固有のsignatureファイルを含んでおく必要があります。
会場で用意している端末については、signatureをコチラ↓に作成してあります。
https://drive.google.com/file/d/0B6HUPO5amNViODUzdE5GZDRfS3M/view?usp=sharing
ダウンロードして Assets > Plugins > Android > Assetsフォルダにコピーしてください。
ビルド
シンプルなサンプルシーンをビルドしてみます。
VRSampleScenes > Scenes > Examples > RenderScale のシーンを開いてください。
File > Build Setting > Build でビルドします。

実機にインストール
adbコマンドを使うのが楽です。
PCとスマホ端末をUSBケーブルで繋いで以下コマンドを実行するとapkファイルがスマホに転送&インストールされます。
adb install -r YourApp.apk
実機で確認
飛行機っぽいものが表示されたらOKです。
これでビルドまではOKですね!
(補足)
signatureを自分で作る場合
USBデバッグONにしたスマホをpcに繋いでadb devicesを叩く。
$ adb devices
List of devices attached
1215fc1cba401505 device
表示されたシリアルナンバーを https://dashboard.oculus.com/tools/osig-generator/ で入力するとsignatureファイルが生成されダウンロードできる。
Gear VR用ビルドの設定
今回はアセットのインポート時にVR向けビルドの設定も勝手にやってくれていました。
1から作る場合は以下のような設定も必要です。
- Player Settings > Other Settingsの「Virtual Reality Supported」をオンにして、Virtual Reality SDKで「Oculus」を選ぶ
- Minimum API Levelを「Android 4.4 ‘KitKat’ (API level 19)」以上
【2】視線入力で選択するUIを作ってみよう
向いた方向の視線で操作するサンプルです。
外付けのコントローラーがない場合は、
メニュー選択など様々な場面で使うことになると思います。
主な登場人物
- VREyeRaycaster.cs
カメラから光線を出してくれる。
その光線がオブジェクトに当たったかどうかで、視線入力の判定をする。 - VRInteractiveItem.cs
光線を受け取った、光線が外れた、などのイベントを発行してくれる。
そのイベントを自作スクリプトで購読し、何らかの処理をするとよい。 - Reticle
視線方向を示すために表示される照準の小さい点。
MainCameraの置き換え
新しいシーンを作成し、
まずMainCameraをVR対応のものに置き換えます。
デフォルトのMainCamraを削除して
VRSampleScenes/Prefabs/Utils/MainCamera
に置き換えましょう。
このMainCamraには視線のターゲットとなる印や、キー入力をハンドルするスクリプトが組み込まれています。
MainCamera配下のGUIReticleが照準を示す点、UISelectionBarが照準が合っているときにギューンと増えるゲージです。
今回はゲージは必要ないので、UISelectionBarとBackgroundは無効にし、GUIReticleのImageだけ使うので有効にしておきます。
次に、Editorでの開発用にカメラをキーボードで動かせるようにしておきます。
以下のスクリプトをMainCameraにアタッチします。
これでEditorで開発中はカーソルで向いてる方向を変えることが出来ます。
using UnityEngine;
using System.Collections;
public class EditorCameraRotation : MonoBehaviour
{
void Update()
{
#if UNITY_EDITOR
if (Input.GetKey(KeyCode.RightArrow))
{
this.transform.Rotate(0, 1, 0);
}
else if (Input.GetKey(KeyCode.LeftArrow))
{
this.transform.Rotate(0, -1, 0);
}
else if (Input.GetKey(KeyCode.UpArrow))
{
this.transform.Rotate(-1, 0, 0);
}
else if (Input.GetKey(KeyCode.DownArrow))
{
this.transform.Rotate(1, 0, 0);
}
#endif
}
}
対象のオブジェクトの配置
視線が合うと反応する対象のオブジェクトを作成します。
Cubeを適当な位置に配置し、
VRStarndardAssets/Scripts/VRInteractiveItem.cs
をCubeにアタッチします。
VRInteractiveItem.csは、先ほどのMainCameraが発するRayCastを受け取ってイベントを発行してくれるスクリプトになります。
視線が当たったときのアクション
先ほどのVRInteractiveItem.csの発行するイベントを受け取って、何らかのアクションをするようにしてみましょう。
Cubeに以下のスクリプトをアタッチします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRStandardAssets.Utils;
public class ChangeColor : MonoBehaviour
{
[SerializeField] private VRInteractiveItem m_InteractiveItem;
public bool isGazeOver;
private void OnEnable()
{
m_InteractiveItem.OnOver += HandleOver;
m_InteractiveItem.OnOut += HandleOut;
}
private void OnDisable()
{
m_InteractiveItem.OnOver -= HandleOver;
m_InteractiveItem.OnOut -= HandleOut;
}
// 視線が当たったとき
private void HandleOver()
{
isGazeOver = true;
gameObject.GetComponent<Renderer>().material.color = Color.red;
}
// 視線が外れたとき
private void HandleOut()
{
isGazeOver = false;
gameObject.GetComponent<Renderer>().material.color = Color.white;
}
}
Editor上でVRInteractiveItemに自分自身のCubeを指定しておきます。

動作確認
Editorで起動してみると、視線が当たったときにCubeの色が変わっていることが確認できます。
この手順で、例えばどのメニューに今視線が当たってるかを判断したり出来ます。
【3】GearVRタッチパッドの入力を受け取ってみよう
GearVRには側面にタッチパッドが付いています。
先ほどの続きで、タッチパッドがタップされたらCubeが緑になるように改修してみます。
ChangeColor.csに以下のコードを追加します。
これで視線が当たっているときに、タップするとCubeが緑色に変化するようになります。
public class ChangeColor : MonoBehaviour
{
/*中略*/
private void OnEnable()
{
/*中略*/
m_InteractiveItem.OnClick += HandleClick;
}
private void OnDisable()
{
/*中略*/
m_InteractiveItem.OnClick -= HandleClick;
}
/*中略*/
// Clickされたとき
private void HandleClick()
{
if(isGazeOver)
{
gameObject.GetComponent<Renderer>().material.color = Color.green;
}
}
}
実行結果です。
この要領で、メニューをタップで選択する機能などが実装できると思います。

【4】Gear VR コントローラーを使ってみよう
GearVRには別売りで専用のコントローラーがあります。
これを使うとレーザーポインターのような感覚でメニューを選んだり、コントローラーで狙ってガンシューティングしたりと操作の幅が広がります。
Gear VRコントローラーでできること
- ピッチ、ロール、ヨーの検出
- タッチパッド、トリガー、ホーム、戻るボタンの検出
なので手の奥行きや水平の位置は取得できないのでご注意を!
Oculus Utilities for Unity 5
Oculusの提供するUtilityをインポートします。
https://developer.oculus.com/downloads/package/oculus-utilities-for-unity-5/
からダウンロードします。
Main Cameraの差し替え
File > New Scene から新しいシーンを作ってください。
そして、デフォルトのMainCameraを削除して
OVR/Prefabs/OVRCameraRig
を配置します。
コントローラーのモデル表示
RightHnadAnchorの配下に
Assets/OVR/Prefabs/GearVrController
を配置し、以下のように設定します。

動作確認
手元を見るとコントローラーが表示されていて、手首の動きに連動しているはずです。

【5】コントローラーで指して選択する
先ほどの視線入力を応用し、
コントローラー(RightHandAndor)の先にReticleを表示し、また光線も出るようにします。
VRSampleScenes/Prefabs/Utils/MainCamera
のプレファブ内のVRCameraUIだけコピーして、RightHandAnchorの配下に配置します。
RightHandAnchorに以下のスクリプトをアタッチします。
- VRInput.cs
- Reticle.cs
- VREyeRaycaster.cs
対象のオブジェクト(Cube)を配置します。前回と同じくVRInteractive.csとChangeColor.csをアタッチします。
ビルドして実機で確認すると、こんな感じでコントローラーでCubeを指すと色が変わります。
【6】GearVRコントローラーのトリガーやタッチパッドの入力を受け取る
GearVRコントローラーにはトリガー、タッチパッドが付いています。
これらを利用すればモノを掴んだり、銃のトリガーを引くなど面白い操作が可能になります。
これらの入力を扱いやすくするスクリプトを用意してみました。
(Unity公式のVRInput.csを参考にしています)
using System;
using UnityEngine;
public class GearVRInput : MonoBehaviour
{
public event Action OnTriggerDown;
public event Action OnTriggerUp;
public event Action OnSwipeUp;
public event Action OnSwipeDown;
public event Action OnSwipeLeft;
public event Action OnSwipeRight;
public event Action OnTouchPadTouchDown;
public event Action OnTouchPadTouchUp;
public event Action OnTouchPadButtonDown;
public event Action OnTouchPadButtonUp;
private void Update()
{
CheckInput();
}
private void CheckInput()
{
// トリガー
if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))
{
if (OnTriggerDown != null)
OnTriggerDown();
}
if (OVRInput.GetUp(OVRInput.Button.PrimaryIndexTrigger))
{
if (OnTriggerUp != null)
OnTriggerUp();
}
// スワイプでButton.Up, Down, Left, Rightが反応するっぽい
if (OVRInput.GetDown(OVRInput.Button.Up))
{
if (OnSwipeUp != null)
OnSwipeUp();
}
if (OVRInput.GetDown(OVRInput.Button.Down))
{
if (OnSwipeDown != null)
OnSwipeDown();
}
if (OVRInput.GetDown(OVRInput.Button.Left))
{
if (OnSwipeLeft != null)
OnSwipeLeft();
}
if (OVRInput.GetDown(OVRInput.Button.Right))
{
if (OnSwipeRight != null)
OnSwipeRight();
}
// タッチパッドのタッチ
if (OVRInput.GetDown(OVRInput.Touch.PrimaryTouchpad))
{
if(OnTouchPadTouchDown != null)
OnTouchPadTouchDown();
}
if (OVRInput.GetUp(OVRInput.Touch.PrimaryTouchpad))
{
if(OnTouchPadTouchUp != null)
OnTouchPadTouchUp();
}
// タッチパッドのクリック
if (OVRInput.GetDown(OVRInput.Button.PrimaryTouchpad))
{
if(OnTouchPadButtonDown != null)
OnTouchPadButtonDown();
}
if (OVRInput.GetUp(OVRInput.Button.PrimaryTouchpad))
{
if(OnTouchPadButtonUp != null)
OnTouchPadButtonUp();
}
}
private void OnDestroy()
{
OnTriggerDown = null;
OnTriggerUp = null;
OnSwipeUp = null;
OnSwipeDown = null;
OnSwipeLeft = null;
OnSwipeRight = null;
OnTouchPadTouchDown = null;
OnTouchPadTouchUp = null;
OnTouchPadButtonDown = null;
OnTouchPadButtonUp = null;
}
}
このGearVRInput.csをCameraなど適当なオブジェクトにアタッチして、
使う側では以下のような感じで使えます。
// トリガー入力を受け取って何かする例
public class GearVRInputTest : MonoBehaviour
{
[SerializeField] GearVRInput m_GearVRInput;
private void OnEnable()
{
m_GearVRInput.OnTriggerDown += HandleTriggerDown;
}
private void OnDisable()
{
m_GearVRInput.OnTriggerDown -= HandleTriggerDown;
}
private void HandleTriggerDown()
{
Debug.Log("Trigger Down!");
}
}
以上です!







