Unity
VR
OculusGo

Oculus Goでサクッと車を動かす

Oculus Goで車を動かす

UnityではStandard AssetsでVehiclesという、車の挙動を簡単に利用できるアセットが提供されています。
これをOculusGoに対応させて、FPS視点で操作できるようにしてみました。

20180616-202651.jpg

手順

Vehiclesをインポート

Assets > Import Package > Vehiclesからアセットパッケージをインポートします。

Screenshot 2018-06-15 09.10.50.png

CarプレハブをHierarchyに追加

ProjectのStandard Assets > Vehicles > Prefabs > CarをHierarchyに追加します。

Cursor_and_Unity_2018_2_0b6_Personal__64bit__-_Untitled_-_SafariParkVR_-_Android__Personal___Metal__and_Screenshot_2018-06-15_09_11_27.png

Main CameraをCarの子要素にする

SceneのMain CameraをCarの下にドラッグ&ドロップします。

Screenshot 2018-06-15 09.11.51.png

Main Cameraのtransformを調整

カメラを車が操作しやすい位置と角度にお好みで調整します。

Cursor_and_Unity_2018_2_0b6_Personal__64bit__-_Demo_unity_-_SafariParkVR_-_Android__Personal___Metal__and_Oculus_Goのコントローラーを表示させる_-_Qiita.png

ステージをつくる

車を走らせるためのステージをつくります。

Cursor_and_Unity_2018_2_0b6_Personal__64bit__-_Demo_unity_-_SafariParkVR_-_Android__Personal___Metal_.png

ここでは、Simple Home Stuffというアセットをお借りしてステージとして利用しました。
車とステージのサイズ感を合わせるため、CarのScaleを0.25に設定しています。

Oculus Goのコントローラーから操作できるようにする

CarプレハブにアタッチされているCarUserController.csを削除し、新たにCarMovementController.csを作成&アタッチします。
ここでは、コントローラーのタッチパッドにアクセルと方向転換、トリガーにブレーキ(バック)を割り当てています。

using UnityEngine;
using UnityStandardAssets.Vehicles.Car;

[RequireComponent(typeof (CarController))]
public class CarMovementController : MonoBehaviour
{
    private CarController m_Car;

    private void Awake()
    {
        m_Car = GetComponent<CarController>();
    }

    private float h;
    private float v;
    private void Update()
    {
        OVRInput.Update();

        // タッチパッドを触っている座標を元に進む方向を決める
        Vector2 touchVec = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad);
        h += touchVec.x * 0.1f * Time.deltaTime;

        // タッチパッドを押していたらアクセル
        if(OVRInput.Get(OVRInput.Button.One))
        {
            v += 0.1f * Time.deltaTime;
        }
        // トリガーを押していたらブレーキ
        else if (OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger))
        {
            v -= 0.1f * Time.deltaTime;
        }
        else
        {
            v = 0f;
        }
    }

    private void FixedUpdate()
    {
        OVRInput.FixedUpdate();

        m_Car.Move(h, v, v, 0f);
    }
}

レッツビルド!