Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

[ハンズオン資料] VRハンズオン - Gear VRとコントローラーで遊んでみよう♪

0
Last updated at Posted at 2017-07-31
Page 1 of 33

今回のハンズオンでやること

  1. GearVRアプリのビルド
  2. 視線で選択する
  3. タッチパッドで入力する
  4. GearVRコントローラーを使う
  5. コントローラーで指して選ぶ
  6. コントローラーのボタンを使う

事前準備

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
のチェックを外して下さい。

スクリーンショット_2017-07-31_23_07_08.png

サンプルを実機向けにビルドしてみる

signatureファイルの設定

ストア公開前のGear VRアプリを実機で試すためには、apkビルド時に端末固有のsignatureファイルを含んでおく必要があります。
会場で用意している端末については、signatureをコチラ↓に作成してあります。
https://drive.google.com/file/d/0B6HUPO5amNViODUzdE5GZDRfS3M/view?usp=sharing

ダウンロードして Assets > Plugins > Android > Assetsフォルダにコピーしてください。

スクリーンショット 2017-07-31 15.06.21.png

ビルド

シンプルなサンプルシーンをビルドしてみます。
VRSampleScenes > Scenes > Examples > RenderScale のシーンを開いてください。

File > Build Setting > Build でビルドします。
Build_Settings_と_Unity_5_6_2f1__64bit__-_RenderScale_unity_-_GearVRTest5_-_PC__Mac___Linux_Standalone__OpenGL_4_1_.png


実機にインストール

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を作ってみよう

向いた方向の視線で操作するサンプルです。
外付けのコントローラーがない場合は、
メニュー選択など様々な場面で使うことになると思います。

gearvr_cube.mov.gif!


主な登場人物

  • VREyeRaycaster.cs
    カメラから光線を出してくれる。
    その光線がオブジェクトに当たったかどうかで、視線入力の判定をする。
  • VRInteractiveItem.cs
    光線を受け取った、光線が外れた、などのイベントを発行してくれる。
    そのイベントを自作スクリプトで購読し、何らかの処理をするとよい。
  • Reticle
    視線方向を示すために表示される照準の小さい点。

Untitled(3).png


MainCameraの置き換え

新しいシーンを作成し、
まずMainCameraをVR対応のものに置き換えます。

デフォルトのMainCamraを削除して
VRSampleScenes/Prefabs/Utils/MainCamera
に置き換えましょう。

スクリーンショット 2017-07-15 15.10.18.png

このMainCamraには視線のターゲットとなる印や、キー入力をハンドルするスクリプトが組み込まれています。

MainCamera配下のGUIReticleが照準を示す点、UISelectionBarが照準が合っているときにギューンと増えるゲージです。
今回はゲージは必要ないので、UISelectionBarとBackgroundは無効にし、GUIReticleのImageだけ使うので有効にしておきます。


次に、Editorでの開発用にカメラをキーボードで動かせるようにしておきます。
以下のスクリプトをMainCameraにアタッチします。
これでEditorで開発中はカーソルで向いてる方向を変えることが出来ます。

EditorCameraRotation.cs

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に以下のスクリプトをアタッチします。

ChangeColor.cs
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を指定しておきます。
qiita1.png


動作確認

Editorで起動してみると、視線が当たったときにCubeの色が変わっていることが確認できます。
この手順で、例えばどのメニューに今視線が当たってるかを判断したり出来ます。

gearvr_cube.mov.gif


【3】GearVRタッチパッドの入力を受け取ってみよう

GearVRには側面にタッチパッドが付いています。
先ほどの続きで、タッチパッドがタップされたらCubeが緑になるように改修してみます。


ChangeColor.csに以下のコードを追加します。
これで視線が当たっているときに、タップするとCubeが緑色に変化するようになります。

ChangeColor.cs

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;
    }
  }
}

実行結果です。
この要領で、メニューをタップで選択する機能などが実装できると思います。
qiita3.mov.gif


【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
を配置します。

スクリーンショット 2017-07-15 22.13.11.png


コントローラーのモデル表示

RightHnadAnchorの配下に
Assets/OVR/Prefabs/GearVrController
を配置し、以下のように設定します。
スクリーンショット 2017-07-15 22.16.15.png

同様にLeftHandAnchorも設定します。
qiita2.png


動作確認

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


【5】コントローラーで指して選択する

先ほどの視線入力を応用し、
コントローラー(RightHandAndor)の先にReticleを表示し、また光線も出るようにします。

VRSampleScenes/Prefabs/Utils/MainCamera
のプレファブ内のVRCameraUIだけコピーして、RightHandAnchorの配下に配置します。

qiita3.png


RightHandAnchorに以下のスクリプトをアタッチします。

  • VRInput.cs
  • Reticle.cs
  • VREyeRaycaster.cs

そして以下のように設定します。
スクリーンショット 2017-07-15 22.41.15.png


対象のオブジェクト(Cube)を配置します。前回と同じくVRInteractive.csとChangeColor.csをアタッチします。

ビルドして実機で確認すると、こんな感じでコントローラーでCubeを指すと色が変わります。

gearvr_controller_demo.mov.gif


【6】GearVRコントローラーのトリガーやタッチパッドの入力を受け取る

GearVRコントローラーにはトリガー、タッチパッドが付いています。
これらを利用すればモノを掴んだり、銃のトリガーを引くなど面白い操作が可能になります。


これらの入力を扱いやすくするスクリプトを用意してみました。
(Unity公式のVRInput.csを参考にしています)

GearVRInput.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!");
  }
}


以上です!

2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?