Unityメモ – GoogleVRでの1眼2眼とGearVR対応する方法

Posted: 2016年8月29日 カテゴリー: ゲームジャム, プログラミングメモ, Unity, Unity メモ, VR
タグ:, , , , , , ,

今週末ドワンゴさんでMobile VR Jamというイベントに参加して来まして、そこで作ったアプリで最新版のGoogleVR SDK(旧Cardboard SDK)に触る機会が有りましたので、イベントでやったのも含めてGoogleVRの1眼2眼切り替え設定と、GoogleVRとGearVRの切り替え対応を紹介します。

今回はUnity5.4.03fとGoogleVR 0.91を前提として紹介します。

ちなみに、「空間電書ー空白の海」でもやってはいるのですが、Unity 5.3.4とGoogleVRのバージョン0.8を使っていまして、その時に比べて最新版の方が圧倒的に楽なのでそっちを推奨したい為、その時の処理はスルーで行きます。

 

1眼2眼切り替え

これはやるだけなら凄く簡単です。GoogleVRのUnity PackageをUnityに入れた後に、GoogleVR/Prefabs/GvrViewerMainのプレハブを見てみてください。この中のGvrViewerと言うコンポーネント内に、”VR Mode Enabled”と言うbool値があります。これがtrueだと2眼で、falseだと1眼になります。

pic

 

2眼

pic2

 

1眼

pic3

 

はい、出来ました!

どうです、簡単でしょう!!

・・・え、知りたいのはそこじゃない?起動中に変えると切り替えが気になるから起動時に設定しておきたい?あ、はい。

GvrViwerの初期化前に設定しておく手段を2通り紹介します。まず、メニュー画面とかで1眼2眼選んでもらいます。

 

何処かで見た事あるロゴ

pic4

それで1つ目の方法としては、VRModeEnabledの値をtrueにしてあるプレハブと、falseにしてあるプレハブを用意して、実際にGvrViewerMainをシーンで作る時に、選択した方のプレハブを生成する事で出来ます。

もう一つはGvrViewerMainに新しくコンポーネントを追加して、それをGvrViewerの上に設定します。そのスクリプトのStart()内で、GvrViewerのVRModeEnabledを設定出来ます。例のスクリプトです:

    public static class GameSettings
    {
        public static bool IsVRMode = true;
    }

    public class VRSetuper
        : MonoBehaviour
    {
        void Start()
        {
            GvrViewer viewer = GetComponent<GvrViewer>();
            viewer.VRModeEnabled = GameSettings.IsVRMode;
        }
    }

この例だとメニューで選択した時にGameSettings.IsVRModeの値を書き換えます。

1眼2眼は以上です。起動時に気になるとか書きましたが、そこら辺を気にしてこれらの少しだけ面倒事をやる必要があるのかは是非自分で試してから判断してください。もしかしたらSDKの更新で要らなくなっている可能性もありますので、まずはやってみましょう。

 

GoogleVRとGearVRの切り替え

さて次はGearVRとGoogleVRの切り替えになります。前は面倒でしたが、GoogleVRの最新版だと結構楽に出来ます。まず前提知識として、GearVR対応はUnityの[PlayerSettings > Other Settings] 内にある、Virtual Reality Supportedをオンにすると、出来ます。このVirtual Reality Supportedの設定はスクリプト内からも拾えます:

UnityEngine.VR.VRSettings.enabled

それで自分がMobile VR Jam内で実装した方法としましては、まずシーン内にVR設定用のオブジェクトを配置します。そのStart()処理内で、GoogleVRならGvrViewerMainのプレハブからインスタンスを作り、GearVRなら何もせずに終わります(GearVRのカメラ追従等は自動で行われます)。

では実装です:

// GearVR対応確認を分かりやすくする為に宣言
public static bool IsGearVR
{
        get { return UnityEngine.VR.VRSettings.enabled; }
}

public class VRSetuper 
    : MonoBehaviour 
{
    ///
<summary>
    /// GoogleVR用のプレハブ
    /// </summary>

    [SerializeField]
    GvrViewer m_gvrViewer = null;

    void Start() 
    {
        if (IsGearVR)
        {
            // GearVRは何もしないで終わる
            return;
        }

        // GoogleVR用のオブジェクトを作る
        GvrViewer viewer = (Instantiate(m_gvrViewer) as GvrViewer);
    }
}

これでインスタンスを生成するプレハブを設定すれば出来ます。ついでに、上記の1眼2眼対応も含めてみます:

    void Start() 
    {
        if (IsGearVR)
        {
            // GearVRは何もしないで終わる
            return;
        }

        // GoogleVR用のオブジェクトを作る
        GvrViewer viewer = (Instantiate(m_gvrViewer) as GvrViewer);

        // 1眼2眼設定。メニューで行って設定の値をIsVRModeの中に入れておく
        viewer.VRModeEnabled = <code class="csharp plain">GameSettings.IsVRMode;</code>;
    }

これで対応出来ます。わーい。

これでシーン内にこのスクリプトをアタッチしてあるオブジェクトを配置し、プレハブが設定されていれば大丈夫です(通常のカメラ等は既に有る前提になりますが)。

pic5

実装の紹介はこれで終わりですが、おまけでこれを使用する時に気をつける所を2点ほど。

まず、1眼2眼設定しているスマホ用のメニューをそのまま置くと、GearVRだと見えないし、選択出来ない可能性があります。GearVRではuGUIはWorld Spaceでないと描画されないので、気をつけてください。今回のアプリでは、上記のGearVR対応と同じ方法を使ってGoogleVR用とGeaVR用のメニューを別に用意し、使う方を生成する様にしました。

もう1点はGoogleVRのサンプルで使用されている入力用のGazeInputModuleやFPSカウンターをそのままGearVR版で使用すると、GvrViewrがシーン内に無い為、エラーが出ます。なので、これらを使用する時はお気をつけください。

 

以上になります。

 

現実逃避止めて作業怠けずがんばります・・・


//

コメント

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中