Unity
Oculus
VR
OculusGo

Oculus Goで大自然をかけまわってみる

はじめに

Oculus Goでマップを配置してその中を駆け回るアプリを作ってみました。
Unityもほぼ初心者ですが、コントローラーの取得など色々と試行錯誤してみたので、もし参考になる方がいれば嬉しいです。

ソースコードは以下に上げてあります。
ShootTheBalanceBallForOculusGo

ソースコードでは跳ね回るバランスボールをレーザーポインターを合わせてトリガーを押せばバランスボールが消えるようになってます。
今回はその部分は省きますが、もう少し修正を加えたあとで加筆したいと思います。
(現在はプレイしたら数秒で酔うような状態になってしまっているんです...)

プロジェクトを立ち上げる

まずはUnityプロジェクトを作成します。

スクリーンショット 2018-06-03 14.37.57.png

Project Nameにはご自身で適当な名前を入力してください。
それ以外の項目は特に変更する必要がありません。Templateが3Dになっていることだけ確認してください。

マップアセットをインポート、プロジェクトへ配置

まず初めにマップアセットをインポートして、画面に表示していきます。
今回は以下のAssetを使用しました。
普段、都会で生活しているので、VRの中でぐらい無人島のような自然に触れることにしました。
後はゼルダの伝説が好きなので、それっぽいアセットを探したら見つかったのが以下だったのも理由の一つです。

スクリーンショット 2018-06-03 14.41.53.png

それではUnityのプロジェクトからアセットをインポートします。
画面上部にあるメニューバーからWindow -> AssetStoreを選択肢AssetStoreにアクセスします。

すると、以下のようなSceneビューと同じ場所にAssetStoreが出てきたのが確認できると思います。
次に検索バーにFree Island Collectionと入力し、右にある虫眼鏡のようなボタンから検索し、検索結果一覧からFree Island Collectionを選択すると以下のような画面になると思います。
ここでImportをクリックすると自身のプロジェクトにアセットをインポートすることができます。

スクリーンショット 2018-06-03 14.53.03.png

以下のようなダイアログが表示されますが、そのままImportして頂いて問題ありません。

スクリーンショット 2018-06-03 14.54.44.png

これでプロジェクトにアセットをインポートすることが出来ました。
これからこのアセットを画面に配置していきます。

今回はアセットの中にあるサンプルのシーンをそのまま利用していきたいと思います。
まず先程のSceneビューに戻って頂き、ProjectビューからAsset -> Free Island Collection -> Sceneを選択し、Scene1をクリックして表示します。

スクリーンショット 2018-06-03 14.58.29.png

するとSceneビューに以下のように表示されるかと思います。

スクリーンショット 2018-06-03 15.02.59.png

Reflection ProbeとTerrainというのがこの島を表示してるオブジェクトのようなのでそのままコピーして利用しましょう。
この2つを選択した状態でコピーをしたあと、本来のSceneに戻るためにAsset -> Scene -> SampleSceneを選択します。

先程の何も表示されていないSceneビューが表示されたのを確認したらHierarchyビューの上で貼り付けて下さい。

スクリーンショット 2018-06-03 15.05.25.png

するとこのように島が表示されると思います。
しかしこのままだとMain Cameraの位置がまったくあっていないのでInspectorビューからMain CameraのPositionを調整していきます。
ここは配置したいPositionを島の好きな位置に、ご自由に調整していただいて結構です。
自分は1100, 110, 500に設定しました。

スクリーンショット 2018-06-03 15.12.05.png

これでOculus Goで島の中に入り込むことが出来ました。

移動できるようにする

ここままで島のアセットを配置して、表示するところまでは出来ました。
しかし今のままではまったく移動できないのであまり面白くありません。
せっかく無人島なのですから、FPSのような一人称視点で、自由に動き回ることが出来たほうが良いでしょう。

色々な方法があると思いますが、今回はとりあえずMain Cameraをコントローラーの入力に応じてそのまま移動させてみます。

その前にOculus Goのコントローラーを表示させる必要があるので、そちらの対応から行います。
以下のページからUnityパッケージをダウンロードします。
https://developer.oculus.com/downloads/package/oculus-utilities-for-unity-5/

ダウンロードが終了したらAsset -> ImportPackage -> Custom Packageを選択し、先程ダウンロードしたOculus Utilitiesパッケージをインポートします。

スクリーンショット 2018-06-03 16.33.04.png

スクリーンショット 2018-06-03 16.33.20.png

コントローラーの表示には、Prefabに既に用意されているものを使用します。
Assets -> Oculus -> VR -> Prefabsの中にあるOVRCameraRigをHierarchyビューに配置します。
設定後はMain Cameraはもう使用しないので削除してください。

これでコントローラーの表示が出来るようになりました。次は移動です。

OVRCameraRigにAdd Componentで以下の3つをつけてください。

  • Capsule Collider
  • Rigidbody
  • スクリプト(Player)

RigidbodyはConstraintsも設定する必要があります。
Inspectoreビューが以下のようになっていればOKです。

スクリーンショット 2018-06-03 16.49.48.png

それでは次に先程作成したPlayerスクリプトを編集します。
以下のようなコードに変更して下さい。

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

public class Player : MonoBehaviour {

    Rigidbody m_Rigidbody;

    // Use this for initialization
    void Start () {
        // 自分のRigidbodyを取ってくる
        m_Rigidbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void FixedUpdate () {
        float x = 0.0f;
        float z = 0.0f;
        Vector2 touchPadPt = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad);

        if (touchPadPt.x > 0.5 && -0.5 < touchPadPt.y && touchPadPt.y < 0.5) //右方向
        {
            transform.Rotate(new Vector3(0.0f, 0.5f, 0.0f)); // 十字キーで首を左右に回す
            x += 0.5f;
        }
        if (touchPadPt.x < -0.5 && -0.5 < touchPadPt.y && touchPadPt.y < 0.5) //左方向
        {
            transform.Rotate(new Vector3(0.0f, -0.5f, 0.0f));         // 十字キーで首を左右に回す
            x -= 0.5f;
        }
        if (touchPadPt.y > 0.5 && -0.5 < touchPadPt.x && touchPadPt.x < 0.5) //上方向
        {
            z += 5.0f;
        }
        if (touchPadPt.y < -0.5 && -0.5 < touchPadPt.x && touchPadPt.x < 0.5) //下方向
        {
            z -= 5.0f;
        }

        m_Rigidbody.velocity = z * transform.forward + x * transform.right;
    }

}

コードの詳しい説明は以下の記事を確認していただければと思います。
http://chungames.hateblo.jp/entry/2016/07/31/201807

またコントローラーの入力取得部分に関しては以下の記事を確認してください。
https://qiita.com/ry-kgy/items/2b783b969c874ef4cc64

これでコントローラーの取得を元にカメラを移動させることができるようになりました。

Oculusに対応する

最後にOculusGo向けにビルドをする際に必要な設定を行っていきます。

FileからBuild Settings選択して下さい。

スクリーンショット 2018-06-03 15.28.21.png

画面左下にPlatformからAndoridを選択し、Swtich Platoformをクリックして下さい。
これでAndorid端末向けにビルドする準備が出来ました。

スクリーンショット 2018-06-03 15.30.56.png

次に右にあるPlayer Settingsを選択し、VR対応を進めていきます。
InspectorビューにPlayer Settings画面が追加されていると思うので、一番下のXR SettingsからVirtual Reality Supportedにチェックを入れます。
するとVirtual Reality SDKを追加する画面が表示されると思うので、+ボタンからOculusを選択します。

以下のようになればOKです。

スクリーンショット 2018-06-03 16.24.04.png

Other SettingsのMinimum API Levelは19以上が必須なので、それより下のAPI Levelが設定されている方はそこも変更しておいて下さい。

ビルドしてみる

これですべての作業が終了です。
Build Settingsに戻って頂き、RunDeviceにご自身のOculus Goが認識されているのを確認し、Build And Runを実行しましょう。

これでOculus Goで無人島を自由に動き回ることができるようになりました!

最後に

とりあえずUnityでマップアセットを配置してその中を動き回るということを行いました。
ただ修正しなけばいけない点も多く、現状だと

  • スムーズな移動が実現できていない
  • めちゃくちゃ酔う
  • 最初に移動する際に下方向に沈む感じになってる

という問題が存在しています。
これらの問題の解決方法をご存知の方やこんなふうに改良したら良くなった!ということがあればぜひぜひ教えて頂きたいです。