-
Notifications
You must be signed in to change notification settings - Fork 18
付録A
高橋 憲一●株式会社カブク
本付録は日本語版オリジナルの記事です。本稿では、Samsung Galaxy S6やS7等のAndroid端末と組み合わせてVRを実現するGear VR用にビルドする方法とそのタッチパッドからの入力について解説します。
Gear VRはSamsungとOculusが共同で開発したVRデバイスで一般向け製品版は2015年の12月に発売開始されました。スマートフォンをHMDに装着するスタイル(図A-1)は他のモバイル系のVRデバイスと同じですが、向きの検出はスマートフォン側のセンサーではなく、HMD側に内蔵した9軸のジャイロセンサーを使用するようになっており、レイテンシーも低く抑えられ安定したVR体験を得ることができます。また、図A-1のような操作用のタッチパッドを右側面に備えています。
図A-1 Samsung Galaxy S6 edgeをGear VRに装着したところ
前提として、Androidアプリのビルドができる環境が整っていることとします。
Gear VRにGalaxy端末をつないで実行するアプリケーションをビルドする際にはOculus Signature Fileという署名ファイルが必要です。
-
テストのためにアプリを実行する端末をPCもしくはMacにUSBケーブルで接続します(Androidアプリをビルドして端末に転送できる設定は済んでいるものとします)。
-
キーボードからコマンドを入力して実行できる環境(ターミナル、コマンドプロンプト等)で次のように入力してEnterキーを押して実行します。
adb devices
-
すると、次のように表示されます。
XXXXXXX
の部分(端末によって異なる英数字の組み合わせ)がDevice IDです。List of devices attached XXXXXXX devices
-
ウェブブラウザでhttps://developer.oculus.com/osig/を開きます(Oculus VRのアカウントでのログインが必要ですが、Gear VRユーザーの場合は初期設定でそのアカウントを作成しているはずです)。
-
Device ID
の欄に3の手順で取得したDevice IDを入力して[Download File]ボタンを押すと、oculussig_XXXXXXX
(XXXXXXX
は端末により変わります)という名前で署名ファイルがダウンロードされます。
あとはプロジェクトのフォルダーの下にあるAssets/Plugins/Android
の下にassets
というフォルダーがまだなければ作成して、ダウンロードした署名ファイルをassets
の下にコピーします。
Unity側で必要なのは、Android用アプリとしてのビルド設定と通常のMain Camera
を使って[Virtual Reality Supported]のチェックボックスをONにすることです。
-
Unityでプロジェクトを開き、メインメニューの[File]→[Build Settings...]を選択します。
-
[Scenes In Build]に現在のシーンがない場合は、[Add Open Scenes]をクリックします。
-
左側のPlatformの一覧から[Android]を選択して、[Switch Platform]をクリックします。
-
それから、[Player Settings...]をクリックします。InspectorパネルにPlayer Settingsが表示されます。
-
[Other Settings]の中にある[Virtual Reality Supported]のチェックをONにします (注1) 。
注1: Unityのバージョン5.4の場合は[Virtual Reality Supported]チェックボックスがチェックされていることに加えて、その下に[Oculus]の文字が表示されていることも確認します。もしなければ[+]ボタンを押して選択肢の中から追加します。
本書ではメインカメラのためのプレハブとして、通常のUnityのカメラとGoogle VR SDKが用意するGvrViewerMain
の両方を含めたMeMyselfEye
を使用してきました。Gear VR用の場合にもこのプレハブを使用できますが、GvrViewerMain
のほうはInspectorパネルの左上のチェックボックスをOFFにして無効にします。
ここでは7章で作成したプロジェクトのPhysicsWorldシーンをGear VRで実行できるように改造していきます。
Gear VRの右側面のタッチパッドをクリッカーとして使用できるようにします。ProjectパネルのAssets/Scripts
フォルダーの下の階層にあるClicker.cs
をダブルクリックしてエディターで開き、次のように修正します。
using UnityEngine;
using System.Collections;
public class Clicker {
public bool clicked() {
return Input.anyKeyDown;
}
}
Gear VRのタッチパッドは、Unityでは基本的なキータッチの一つとして認識されるようになっているためInput.anyKeyDown
で状態を取得できます。ここではGoogle Cardboard用に#if (UNITY_ANDROID || UNITY_IPHONE)
と場合分けしていた部分は削除してあります。
VRで試してみましょう。
対応端末をPCにつないで、Unityのメニューから[Build & Run]を選択するとビルドが行われ、アプリが端末に転送されます。その際、端末側に「このアプリケーションを起動するには、端末をGear VRに挿入します」というダイアログが表示されるので、Gear VRに端末を挿入すると実行することができます。
右側面のタッチパッドをタッチすると、一人称視点としての自分のキャラクターが歩き出すはずです。
Gear VRで動作させることに成功はしましたが、これだけでは少々物足りません。「位置トラッキングを持たないモバイルVRデバイスのために、ジャンプをするための何か別の手法を試す」という7章の挑戦課題をGear VRのタッチパッドを使ってできるようにしてみましょう。
7.8節では「カメラの位置のY座標の急な変化を検出することでプレイヤーが現実世界で実際にジャンプしたかどうか」を検出していました。Gear VRやGoogle Cardboardでは位置トラッキングができないために同様の手法が実現できなかったわけですが、ここではタッチパッドの操作で上下動(Y座標の変化)をするようにしてみます。
機能:タッチパッドで上から下にドラッグして、タッチパッドから指を話すとジャンプする。
-
7章で作成したプロジェクトをUnityで開きます(まだ7章のプロジェクトをまだ完成させていない場合は、完成させてから本稿に取り組みましょう)。
-
Hierarchyパネルで
MeMyselfEye
を選択した状態で、InspectorパネルのJumpGestureをダブルクリックしてエディターで開きます。
JumpGesture.cs
を次のように修正します(+から始まる緑色の行を追加します。行頭の+は入力しないでください)。
using UnityEngine;
using System.Collections;
public class JumpGesture : MonoBehaviour {
public bool isJump = false;
public float jumpForce = 1000.0f;
private float jumpRate = 1.0f;
private float previousHeight;
private HeadLookWalkBounce walkBounce;
// Use this for initialization
void Start () {
previousHeight = Camera.main.transform.position.y;
walkBounce = GetComponent<HeadLookWalkBounce> ();
}
// Update is called once per frame
void Update () {
if (DetectJump ()) {
walkBounce.bounceForce = jumpForce;
}
}
+ #if UNITY_ANDROID
+ private Vector3 prevTouchPos;
+ private bool DetectJump() {
+ if (Input.GetMouseButtonDown (0)) {
+ prevTouchPos = Input.mousePosition;
+ }
+ if (Input.GetMouseButtonUp (0)) {
+ Vector3 touchPos = Input.mousePosition;
+ if ((prevTouchPos.y - touchPos.y) > 30.0f) {
+ return true;
+ }
+ }
+ return false;
+ }
+#else
private bool DetectJump() {
float height = Camera.main.transform.localPosition.y;
float deltaHeight = height - previousHeight;
float rate = deltaHeight / Time.deltaTime;
previousHeight = height;
return (rate >= jumpRate);
}
+#endif
}
タッチパッドに触れている指の位置はInput.mousePosition
でVector3
型の値として取得できます。タッチパッドの下方向に指をスライドすると、そのタッチ位置のy軸の値は減っていきます。
ここで行っていることは、タッチパッドに指が触れた時(Input.GetMouseButtonDown(0)
)のタッチ位置を保持しておき、タッチパッドから指が離れた時(Input.GetMouseButtonUp(0)
)の位置との差分を見て、指が触れた時より下の位置にあるならばジャンプを開始するようにしています。
ただし、このままではタッチパッドに触れた時のクリッカー起動によって歩き出す動作と干渉してしまいます。そこでCliker.cs
を次のように修正して、タッチパッドに触れて、指を動かさずに離した時にのみ反応するようにします。
using UnityEngine;
using System.Collections;
public class Clicker {
+ private Vector3 prevTouchPos;
public bool clicked() {
+ if (Input.GetMouseButtonDown (0)) {
+ prevTouchPos = Input.mousePosition;
+ }
+ if (Input.GetMouseButtonUp (0)) {
+ Vector3 touchPos = Input.mousePosition;
// 前回タッチした位置との距離を求める
+ float diff = (touchPos - prevTouchPos).magnitude;
+ if (diff < 30.0f) {
// 距離がジャンプする判定値より小さければクリックとする
+ return true;
+ }
+ }
+ return false;
}
}
JumpGesture.cs
で実装した処理と似ていますが、ここではタッチパッドに触れた時と離す時の位置との距離がジャンプする判定値(ここでは30.0)より小さい場合はクリックが有効となるようにしています。
VRで試してみましょう。
タッチパッドに軽く触れて動かさずに指を離すと自分のキャラクターが歩き出し、タッチパッドに触れて下方向にスライドさせてから指を離すとその場所でジャンプできるようになったはずです。