Unity + スマホ　5分でVR

Unityとジャイロ機能付きスマホで、両眼立体視のVRアプリを作ってみましょう。
![sss.png](https://qiita-image-store.s3.amazonaws.com/0/59911/f1bcfc17-c03f-4953-544b-bf2545244b60.png)


* Unityで新規プロジェクトを **3Dモードで** 用意します

![ss2016-04-04-8.54.31.png](https://qiita-image-store.s3.amazonaws.com/0/59911/8d4abc75-cb79-2ee2-d4cd-7ba37679fb14.png)

![2014-12-08_102130.png](https://qiita-image-store.s3.amazonaws.com/0/59911/46bad538-3706-5119-7fa4-a8feb4d6bd93.png)

* 作業中わかりやすいよう、キューブとDirectional lightを置きます
![2014-12-08_102440.png](https://qiita-image-store.s3.amazonaws.com/0/59911/b37ab0b6-6e07-9727-a174-c780ac5c31ce.png)

* MainCameraを右クリック＞Duplicateします
![2014-12-08_102645.png](https://qiita-image-store.s3.amazonaws.com/0/59911/2788ba61-fcc3-540c-a447-3a62343ec0ba.png)

* Create EmptyでGameObjectを作成します
![2014-12-08_102804.png](https://qiita-image-store.s3.amazonaws.com/0/59911/e4ee89e8-2b13-6942-a9b3-6fa72d821880.png)

* GameObjectの下にMainCameraを２つとも入れます
![2014-12-08_102931.png](https://qiita-image-store.s3.amazonaws.com/0/59911/e7e8d83e-c99c-4eb5-e8c2-7848b739d13a.png)

* ２つあるMainCameraをそれぞれMainCameraL/Rにリネームします
* MainCameraRからTransform/Camera以外をRemove Componentします
![2014-12-08_103158.png](https://qiita-image-store.s3.amazonaws.com/0/59911/d93cd7ac-3908-5214-cd3b-5c3e23c7ea59.png)

* MainCameraRのTagをUntaggedにします
![2014-12-08_103328.png](https://qiita-image-store.s3.amazonaws.com/0/59911/38b2decf-187a-f6b7-86b1-08dd025e3dff.png)

* MainCameraLのViewport RectをW=0.5にします
* MainCameraRのViewport RectをW=0.5,X=0.5にします
![2014-12-08_103945.png](https://qiita-image-store.s3.amazonaws.com/0/59911/25f907b5-399b-a267-1c32-6fffeaf1af47.png)

* MainCameraLのTransform>Positionを-0.1,0,0に、Rotationを0,0.5,0にします
* MainCameraRのTransform>Positionを0.1,0,0に、Rotationを0,-0.5,0します

* CubeのTransform>Positionを0,0,10にします
* Project > Create > C#　Script でC#スクリプトを gyro という名前で用意します
![2014-12-08_104421.png](https://qiita-image-store.s3.amazonaws.com/0/59911/f46352e7-6c6e-bd8a-f64f-55fb5da213ac.png)

* gyroをダブルクリックするとスクリプトが表示されます
* ジャイロ機能を有効にするため、スクリプトのStart() 内に次の一行を記述します

```
Input.gyro.enabled = true;
```

* ジャイロを下方基準→前方基準に変更してカメラに反映させるため、Update()内に次の一行を記述します
* 
```
transform.rotation = Quaternion.AngleAxis(90.0f,Vector3.right)*Input.gyro.attitude*Quaternion.AngleAxis(180.0f,Vector3.forward);
```

* 上記スクリプトをGameObjectに入れます
![2014-12-08_104934.png](https://qiita-image-store.s3.amazonaws.com/0/59911/5f71f3a0-30b5-95b0-0439-5159f043fba2.png)

* ここまでの作業で、以下のような配置になります。
![ss.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/9d83fa22-8025-156d-462a-a88fbc7e3914.gif)

* Cube１つだと寂しいので、Cubeオブジェクトをたくさん表示する部分を追加します
* Project > Create > C#　Script でC#スクリプトを cubes という名前で用意します
* cubesに以下のコードを記述します

```csharp:cubes.cs
using UnityEngine;
using System.Collections;

public class cubes : MonoBehaviour {
	// Use this for initialization
	void Start () {
		for(int i=0; i<100; ++i){
			// 分身(Cube)を作る
			GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);

			// 分身の親を本体（このオブジェクト）に
			go.transform.parent = gameObject.transform;
			// 元のオブジェクト相対で周囲ランダムに配置
			go.transform.localPosition = Random.onUnitSphere*20f;
			go.transform.localRotation = Random.rotation;
		}
	}
	
	// Update is called once per frame
	void Update () {
		// 本体（分身の親）を回転
		transform.Rotate (Vector3.right * Time.deltaTime * 10f);
	}
}
```
* Cubeオブジェクトに上記cubesをアタッチ（ドラッグ＆ドロップ）します

* BuildSettingsを開きます
* DefaultOrientationをLandscapeにします
![ss_iphone.png](https://qiita-image-store.s3.amazonaws.com/0/59911/de7f9919-1315-505c-318f-c8e8ad0b3a47.png)

* Build&Runで実行します
![DSC01852.jpg](https://qiita-image-store.s3.amazonaws.com/0/59911/5e0c73a7-2716-6de4-fadd-ed955b19e7e0.jpeg)

おつかれさまでした！

***
**補足**

上記はジャイロを使用してカメラの向きを変更しているため、ほとんどの場合、PC上でカメラの向きを変更することができません。
PC上(Unityエディター上)でカメラを動かしてチェックできるようにするには、gyro.csを以下のように記述します。
(`#if UNITY_EDITOR` ～ `#else` の中がPC上(Unityエディター上)で動かすための処理です)

```csharp:gyro.cs

using UnityEngine;
using System.Collections;

public class gyro : MonoBehaviour {
#if UNITY_EDITOR
	private Vector3 rot;
#endif

	// Use this for initialization
	void Start () {
#if UNITY_EDITOR
		rot = transform.rotation.eulerAngles;
#else
		Input.gyro.enabled = true;
#endif
	}
	
	// Update is called once per frame
	void Update () {
#if UNITY_EDITOR
		float spd = Time.deltaTime*100.0f;
		if(Input.GetKey(KeyCode.LeftArrow)){
			rot.y -= spd;
		}
		if(Input.GetKey(KeyCode.RightArrow)){
			rot.y += spd;
		}
		if(Input.GetKey(KeyCode.UpArrow)){
			rot.x -= spd;
		}
		if(Input.GetKey(KeyCode.DownArrow)){
			rot.x += spd;
		}
		transform.rotation = Quaternion.Euler(rot);
#else
		transform.rotation = Quaternion.AngleAxis(90.0f,Vector3.right)*Input.gyro.attitude*Quaternion.AngleAxis(180.0f,Vector3.forward);
#endif

	}
}

```