Unityの基本機能だけを使ってSceneのキューブマップ（全天球画像）を作る

*追記:Unity2018以降は[もっと簡単に作成できます](https://qiita.com/ELIXIR/items/88126039121b9c7e334f)*

今までは[無料のアセット](https://www.assetstore.unity3d.com/en/#!/content/38755)を使ってやっていたのですが、

[Camera.RenderToCubemap](http://docs.unity3d.com/ja/current/ScriptReference/Camera.RenderToCubemap.html)
機能：カメラからキューブマップにレンダリングします。

こんな便利な機能があったなんて知らなかった！
そして使ってみて超便利だったので共有します。

## キューブマップにしたいシーンを作成
キューブマップを作るのに「まずキューブマップを用意します」では本末転倒になってしまうので、[Sphereに全天球画像を貼り付け](http://qiita.com/ELIXIR/items/a5988ca21f38fabca7b0)たりして作成します。
![スクリーンショット 2016-04-10 20.39.04.png](https://qiita-image-store.s3.amazonaws.com/0/59911/09898451-30fa-6489-c645-b07fb353033b.png)

## ダミーのキューブマップ用テクスチャを用意
適当なテクスチャをプロジェクトにドロップします。
~~このテクスチャは後でキューブマップを作る際に上書きされてしまうので、消えてもいいものを使ってください。~~
* 追記：cubemapは、後でセーブされたものに差し替える必要があります。

## ダミーのキューブマップ用テクスチャの設定を変更
ダミーのキューブマップ用テクスチャを選択し、Inspectorから設定を変更します。

- Texture Type を Cubemap に変更

## CubeMapマテリアルを用意
Create > Material でマテリアルを作成し、Shader > Skybox > 6Sided を選択、テクスチャにダミーのキューブマップテクスチャを指定します。

## エディタースクリプトを用意
Editorフォルダを作成し、その中に[こちらのUnityサンプルスクリプト](http://docs.unity3d.com/ja/current/ScriptReference/Camera.RenderToCubemap.html)を作成します。

* 追記：サンプルのままだと保存されないので、[こちら](http://stackoverflow.com/questions/34458622/unity-save-cubemap-to-one-circle-image)を参考にスクリプトを修正しました（天地逆に出力されていたのを修正）。

```
// // http://docs.unity3d.com/ja/current/ScriptReference/Camera.RenderToCubemap.html
// http://stackoverflow.com/questions/34458622/unity-save-cubemap-to-one-circle-image
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Linq;
using System.IO;

public class RenderCubemapWizard : ScriptableWizard {

	public Camera camera;
	public Cubemap cubemap;

	void OnWizardUpdate () {
		string helpString = "Select transform to render from and cubemap to render into";
		bool isValid = (camera != null) && (cubemap != null);
	}

	void OnWizardCreate () {
		if (camera == null) {
			camera = Camera.main;
		}
		// render into cubemap		
		camera.RenderToCubemap( cubemap );
		cubemap.Apply ();
		ConvertToPng ();
	}

	[MenuItem("GameObject/Render into Cubemap")]
	static void RenderCubemap () {
		ScriptableWizard.DisplayWizard<RenderCubemapWizard>(
			"Render cubemap", "Render!");
	}

	void ConvertToPng()
	{
		Debug.Log(Application.dataPath + "/" +cubemap.name +"_PositiveX.png");
		var tex = new Texture2D (cubemap.width, cubemap.height, TextureFormat.RGB24, false);
		var bytes = getPlanePixels(tex,CubemapFace.PositiveX);      
		File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name +"_PositiveX.png", bytes);       

		bytes = getPlanePixels(tex,CubemapFace.NegativeX);     
		File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name +"_NegativeX.png", bytes);       

		bytes = getPlanePixels(tex,CubemapFace.PositiveY);     
		File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name +"_PositiveY.png", bytes);       

		bytes = getPlanePixels(tex,CubemapFace.NegativeY);     
		File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name +"_NegativeY.png", bytes);       

		bytes = getPlanePixels(tex,CubemapFace.PositiveZ);     
		File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name +"_PositiveZ.png", bytes);       

		bytes = getPlanePixels(tex,CubemapFace.NegativeZ);     
		File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name   +"_NegativeZ.png", bytes);       
		DestroyImmediate(tex);

	}

	byte[] getPlanePixels(Texture2D _tex, CubemapFace _face){
		Texture2D tmpTex = new Texture2D (cubemap.width, cubemap.height, TextureFormat.RGB24, false);
		tmpTex.SetPixels(cubemap.GetPixels(_face));
		Color[] vline;
		for (int x = 0; x < cubemap.width; ++x) {
			vline = tmpTex.GetPixels (x, 0, 1, cubemap.height);
			_tex.SetPixels (x, 0, 1, cubemap.height,vline.Reverse().ToArray());
		}
		return _tex.EncodeToPNG();     
	}

}
```

## スクリプトを実行する
GameObjectメニューから Render into Cubemap を実行します。
![スクリーンショット 2016-04-10 20.43.00.png](https://qiita-image-store.s3.amazonaws.com/0/59911/ee14be81-4fb5-ecea-4782-173149ab1269.png)

ダイアログウインドウが現れるので、
Render From Position にカメラを、Cubemapにダミーのキューブマップ用テクスチャを指定して実行します
![スクリーンショット 2016-04-10 20.43.24.png](https://qiita-image-store.s3.amazonaws.com/0/59911/f7aa25d7-b3f8-3de0-26b2-34e169ce3d04.png)

## 完成！
* 追記：最終的に出力された６枚の画像をキューブマップのそれぞれの面に設定して完成です。
* 
![スクリーンショット 2016-04-11 22.51.20.png](https://qiita-image-store.s3.amazonaws.com/0/59911/0d4c948a-560d-c3c0-387f-bee6bd60f5ce.png)

- Window > Lighting > Skyboxでキューブマップマテリアルを指定します。

![スクリーンショット 2016-04-10 20.45.11.png](https://qiita-image-store.s3.amazonaws.com/0/59911/c3682e2a-7392-5958-6713-c481c30de6a6.png)

![スクリーンショット 2016-04-10 20.46.39.png](https://qiita-image-store.s3.amazonaws.com/0/59911/8b9e66d8-1838-a375-5388-a175e86ca953.png)