Unityメモ – Unity 5.6でGoogleVRの1眼2眼設定をする方法

Posted: 2017年7月9日 カテゴリー: プログラミングメモ, Unity, Unity メモ, VR
タグ:, , , ,

Unityが公式にGoogleVRのサポートを開始しましたが、それによって変わっている箇所が結構あります。その内の一つとして1眼2眼切り替えの方法が前と変わりましたので、メモしておきます。

 

Unity 2017ではさらに変わってるとかだったらすみません・・・

 

今回は起動中に切り替えるのでなく、メニュー画面で選択した1眼/2眼設定を反映させる方法を紹介します。一応アンドロイド前提で、使用しているUnityのバージョンは5.6.1f1になります。

 

 

プロジェクトのCardboard対応

まずプロジェクトにVR対応とCardboardの対応を追加します

Player Settings>Other Settings

を開き、Virtual Reality Supportedをオンにしてください。

その後、下に出てくるVirtual Reality SDKsに”None”と”Cardboard”を追加してください。

これはアプリがVR機能を使用する事と、それに使用するSDKを設定していっています。

NoneはVR機能を使っていない状態で最初のメニューや1眼を使う時に使う用の設定として最初に追加しています。なので、最初から2眼モードで始まって欲しい場合はCardboardが上に来る様に設定してください。

 

メニュー

ここは細かい事は省略しますが、下記の様な画面で選択された設定(今回は単純に2眼かどうかのbool値)を記録して、別のシーンへ遷移しています

 

1眼2眼の設定

メニュー後に実際に遷移したシーンで設定を行います。

まずは、2眼対応でVRに使用するデバイスとVRモードの設定を行います。

やる事自体は単純で、VRSettings内のデバイス読み込みとオン/オフ設定をするだけです:

private IEnumerator SetVRDevice(string device, bool isEnabled)
{
// デバイス読み込み
UnityEngine.VR.VRSettings.LoadDeviceByName(device);

// 待機
yield return new WaitForSeconds(m_waitDuration);

// VRモードのオン/オフ設定
UnityEngine.VR.VRSettings.enabled = isEnabled;
}

VRSettings.LoadDeviceByName()はデバイス読み込み指定で、Cardboardなら”cardboard”等を渡します。これをコルーチン内でやっているのは読み込み処理が次のフレームで実際に行われる為、待ちを入れる為です(本当は1フレームでも大丈夫なはずですが念の為秒数にしています)。

VRSettings.enabledは単純にVRのオンオフです。これだけでも一応切替が出来る時もありますが、デバイスを変えないとちゃんとは対応出来なかったのでデバイス指定を入れています(詳しく調べるべきですがまた何時か)。

 

次はこれを実際に呼ぶ処理です。

やる事はまた単純で、基本的には作ったコルーチンを呼ぶだけです:

//適当な記録用クラス
public static class GameSettings
{
 public static bool IsVRMode = true;
}

...

// デバイスの指定の定数宣言
// enumか何かを取れないもんだろうか・・・
// VRSettings.supportedDevicesは追加してあるやつの文字列だけだし・・・

// 未使用状態のデバイス名
const string _DEVICE_NONE = "None";

// Cardboardのデバイス名
const string _DEVICE_CARDBOARD = "cardboard";

void Start()
{
SetVRMode(GameSettings.IsVRMode);
}

public void SetVRMode(bool isEnabled)
{
UnityEngine.VR.VRSettings.enabled = isEnabled;
if (isEnabled)
{
StartCoroutine(SetVRDevice(_DEVICE_CARDBOARD, isEnabled));
return;
}
}

GameSettingsがメニューで行った設定を記録してあるクラスの体で書いた例になります。

これで2眼対応は終わったので次は1眼対応です。

 

1眼はVRモードやデバイスを使わないだけなのでVirtual Reality SDKsにNoneを最初に持ってきていれば何もしなくて良いだろう!と思っていた時期がありました・・・

上記がオフになっている状態だとカメラの回転処理が行われない為、1眼の時は自分でその処理を追加する必要があります。

 

今回は以前紹介したジャイロでカメラの回転を行うコンポーネントを使用した例を紹介します。

まず、このコンポーネントカメラに追加します。最初から追加しておいてEnabledだけを変えても大丈夫です。

 private void SetupGyroCamera()
 {
 Camera camera = Camera.main;
 camera.gameObject.AddComponent<GyroCamera>();
 }

取り合えずメインのカメラを拾ってますが、参照を取ったりするのもありです。

次にこれを初期化時に呼び出します

public void SetVRMode(bool isEnabled)
{
UnityEngine.VR.VRSettings.enabled = isEnabled;
if (isEnabled)
{
StartCoroutine(SetVRDevice(_DEVICE_CARDBOARD, isEnabled));
return;
}

// カメラにジャイロで回転を変えるコンポーネントを追加
SetupGyroCamera();
}

これで基本的な実装は終わりです。後はこれを何かのオブジェクトにつければStart()時に設定が行われます。

 

オマケでここからさらにメニューに戻りたい時の処理を紹介します。

と言ってもあまり変わらないですが、作ったSetVRMode()をオフにする設定で呼び出して、ジャイロ用コンポーネントを追加する代わりにデバイスを”None”にする様にすればメニューに戻って再度設定できます。

public void EndVR()
{
// VR系を全部切る
SetVRMode(false, false, false);
}

public void SetVRMode(bool isEnabled, bool isAddGyroCamera, bool isDisableVRDevice)
{
UnityEngine.VR.VRSettings.enabled = isEnabled;
if (isEnabled)
{
StartCoroutine(SetVRDevice(_DEVICE_CARDBOARD, isEnabled));
return;
}

// VRモードから変えたい時は使う
if (isDisableVRDevice)
{
StartCoroutine(SetVRDevice(_DEVICE_NONE, isEnabled));
}

// カメラにジャイロで回転を変えるコンポーネントを追加
if (isAddGyroCamera)
{
SetupGyroCamera();
}
}

 

以上になります。

 

今度はGearVRとの切り替えも見なければ・・・

え、Unity 2017からSignatureがv2になってる? そんな事知るかーーー!! orz

コメント

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中