前回に引き続き、Google VR SDKを利用したVRアプリの実装を進めていきます。今回は入力部分を実装します。

視線ターゲットを表示

まず、視点となる位置に点(Reticle)を描画します。

Assets内にある「GoogleVR/Prefabs/UI/GvrReticle」をシーンにある「Main Camera」の直下にドロップして追加します。

これだけで、視線ターゲット(点)が表示されるようになります。

UGUIのボタンを配置

以下の手順でUGUIのボタンを含むUIを設定します。

Hierarchyの「Create > UI > Button」を選択します。シーン内に、ボタンを含むCanvas、UGUIの管理のためのEventSystemも自動的に作成されます。

<Canvasの設定>

  • 名前 : UICanvas
  • Canvas - Render Mode:Word Space
  • 「Pos X:0, Pos Y:2, Pos Z:3」
  • 「Width:10, Height:4」

<Buttonの設定>

  • 「Pos X:0, Pos Y:0, Pos Z:0」
  • 「Width:100, Height:30」
  • 「Scale X:0.01, Y:0.01, Z:1」

これで下図のようなボタンが配置されます。

UGUIのボタンに反応させる

前もって作成した視線ターゲット(点)を、このUGUIのボタンに反応させるのはGoogle VR SDKに含まれる機能で簡単に実現できます。

UGUIを作成したときに作られたEventSystemに、Assets内にある「GoogleVR/Scripts/GazeInputModule」をアタッチします。

次に、上記EventSystemにアタッチされているStandard Input Moduleのチェックを外して無効化します。

これだけで、視線がボタンに重なったときに丸くなり、画面タッチをすることで、ボタン押下イベントが発生します。

ボタン押下イベントの処理内容も、通常のUGUIのボタン用のOnClickイベントが発動しますので、既にUGUIを使っていた方には問題なく使えるはずです。

OnClickイベントの使い方が分からない方は、本連載の第8回内の「ボタン押下時の処理と数字の処理」という項目を参照して下さい。

特定のキューブに反応させる

次に、シーン内に配置してある特定GameObjectに視線が反応するようにさせます。

シーン内のオブジェクトを直接選択できるようになるので、各種コンテンツで使える技術です。

これから作業するにあたって、シーン内にあるGameObject(キューブ)のうち対象としたいGameObjectを選び、名前を「ReactiveCube」としておきます。

このReactiveCubeに、EventTriggerコンポーネントを追加します。

これだけで、視線がそのキューブにヒットしたときに拡大されるようになります。

次にReactiveCubeにスクリプトを追加し、視線がヒットしているとき、視線がヒットした状態でクリック(タッチ)されたときの処理を実装していきます。

Assets内に「Scripts」というフォルダを作成し、その中に「ReactiveCube」というスクリプトを作成します。内容は次のようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ReactiveCube : MonoBehaviour {

  // ----- Gaze Input

  public void pointerEnter(){
    Debug.Log ("pointer Enter");
    GetComponent ().material.color = Color.red;
  }

  public void pointerExit(){
    Debug.Log ("pointer Exit");
    GetComponent ().material.color = Color.white;
  }

  public void pointerClick(){
    Debug.Log ("pointer Click");
    GetComponent ().material.color = Color.yellow;
  }
}

ReactiveCubeのEventTriggerコンポーネントに各イベントの対応を設定していきます。「Pointer Enter」について具体的な手順を説明します。

まず、「Add New Event Type」ボタンを押して「PointerEnter」を選びます。

続いて、「List is Empty」と表示されていますので、右下の「+」ボタンを押し、イベントに対応する項目を一つ追加します。

次に、「None(Object)」とある項目の右側の◎をクリックして、Scene内にあるReactiveCubeオブジェクトを選択します。

その後、「No Function」のプルダウンを選び、「ReactiveCube」内の「pointerEnter ()」を選びます。

この手順を、「Pointer Exit」、「Pointer Click」についても同様に繰り返します。

設定完了後、実行すると、指定したキューブに視線がヒットしたとき、タッチしたときにキューブの色が変わるようになります。

Google VR SDKの機能テスト : 1眼表示とのトグル

Google VR SDKの基本的な機能をいくつか試すために、最初に表示させたUGUIボタンのアクションを実装します。

Assets内の「Scripts」フォルダ内に「TestSystem」というスクリプトを作成します。内容は次のようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestSystem : MonoBehaviour {

  public void testButtonPressed(){
    toggleVRMode ();
  }

  public void toggleVRMode() {
    GvrViewer.Instance.VRModeEnabled = !GvrViewer.Instance.VRModeEnabled;
  }
}

Buttonの機能のOnClickにこのtestButtonPressed() を呼び出すように、下図のように設定します。

これでボタンを押す度に、VRModeをトグルさせることができます。

VRModeがtrueになっていると2眼タイプ、falseでは1眼タイプですので、それを切り替える事ができます。

Google VR SDKの機能テスト : 歪み補正の設定

レンズ補正のための樽型の設定は、下記のようにして変更できます。

public void toggleVRDistortion() {
  // GVR 1.0.3
  GvrViewer.Instance.DistortionCorrectionEnabled = !GvrViewer.Instance.DistortionCorrectionEnabled;
}

このソースは、今回使用しているGoogle VR SDK 1.0.3用のものですが、1.10.0になると変わるので利用には注意して下さい。

事例紹介

UEIソリューションズとヒューマンデザインが協力し、VRとミュージカルを融合させた「リトルプリンスVR supported by VIVE」というエンターテイメントを発表するようです。

VR機材にはViveを使用し、実写ミュージカルとCG演出の合成を楽しめるようです。中でも一番気になるのは「10人同時のVR映像同期」です。VRコンテンツの問題の一つ「コンテンツの共有感」をどのように解決しているか是非体験してみたいです。

しかし、残念ながら、当面はプレス関係者向けで一般公開は未定とのこと。

今後、どのようなコンテンツに昇華されるのか楽しみです!

著者紹介


山田宏道 (YAMADA Hiromichi) - 株式会社トルクス 代表取締役

千葉大学工学部卒業。ゲームプログラマーを経て、2005年よりフリーランス、2012年 株式会社トルクスを設立し、コンシューマ用途、ビジネス用途等、様々なiOSアプリ、ARアプリ等を受託開発。

2016年4月より島根県奥出雲町在住。現在、VR関連技術に注力しており、2016年10月に「地域おこしVR研究会」を立ち上げ、観光向けVRコンテンツなどを企画、開発中。