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

# Oculus Goで車を動かす

Unityでは[Standard Assets](https://docs.unity3d.com/ja/530/Manual/HOWTO-InstallStandardAssets.html)でVehiclesという、車の挙動を簡単に利用できるアセットが提供されています。
これをOculusGoに対応させて、FPS視点で操作できるようにしてみました。


![20180616-202651.jpg](https://qiita-image-store.s3.amazonaws.com/0/58846/d2917ab1-1a8e-756e-e95f-1b250eec1b33.jpeg)


## 手順

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

<img width="720" alt="Screenshot 2018-06-15 09.10.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/58846/d818d0d4-6507-5068-bf9c-ae99ae01f217.png">


### CarプレハブをHierarchyに追加
ProjectのStandard Assets > Vehicles > Prefabs > CarをHierarchyに追加します。

<img width="1539" alt="Cursor_and_Unity_2018_2_0b6_Personal__64bit__-_Untitled_-_SafariParkVR_-_Android__Personal___Metal__and_Screenshot_2018-06-15_09_11_27.png" src="https://qiita-image-store.s3.amazonaws.com/0/58846/e706ad14-56a8-90e8-b063-7c30ff466633.png">


### Main CameraをCarの子要素にする
SceneのMain CameraをCarの下にドラッグ&ドロップします。

<img width="412" alt="Screenshot 2018-06-15 09.11.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/58846/f537f2af-b4b6-4293-3be5-ba8ccae9760a.png">


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

<img width="1513" alt="Cursor_and_Unity_2018_2_0b6_Personal__64bit__-_Demo_unity_-_SafariParkVR_-_Android__Personal___Metal__and_Oculus_Goのコントローラーを表示させる_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/58846/8a543e17-9672-2ef9-1ac6-88e9d5e74a79.png">


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

<img width="1143" alt="Cursor_and_Unity_2018_2_0b6_Personal__64bit__-_Demo_unity_-_SafariParkVR_-_Android__Personal___Metal_.png" src="https://qiita-image-store.s3.amazonaws.com/0/58846/973dc8cf-570c-f280-41a6-c1111c379776.png">


ここでは、[Simple Home Stuff](https://assetstore.unity.com/packages/3d/simple-home-stuff-69129)というアセットをお借りしてステージとして利用しました。
車とステージのサイズ感を合わせるため、CarのScaleを0.25に設定しています。


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

```c#
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);
	}
}
```


### レッツビルド！
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Oculus Go ドライブ<a href="https://twitter.com/hashtag/OculusGo?src=hash&amp;ref_src=twsrc%5Etfw">#OculusGo</a> <a href="https://twitter.com/hashtag/OculusGoDev?src=hash&amp;ref_src=twsrc%5Etfw">#OculusGoDev</a> <a href="https://t.co/pBl9yTJUFs">pic.twitter.com/pBl9yTJUFs</a></p>&mdash; m4tcha (@_m4tcha) <a href="https://twitter.com/_m4tcha/status/1007873433814777856?ref_src=twsrc%5Etfw">June 16, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>