[Unity]Editor拡張でBuildをする

#概要
前回[Editor拡張でPlayerSettingの値をいじる](http://qiita.com/Daichi-K/items/5b37f39d14387fda4fcc)で独自のウィンドウからいろいろ編集できるようにしたので、今回は**Editor拡張で独自のウィンドウを使ってBuild**していきたいと思います。
「UnityEditor拡張ってなに？」って方は前回の記事をご覧ください。

#必要最低限のGUI
ここではプラットフォームの選択とBuildする際の名前を変更できるGUI作成します。

```ruby:BuildSetting.cs
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;

public class BuildSetting : EditorWindow {

	//対象プラットフォーム
	int buildTypeNum;

	//フォルダネーム
    string buildName = PlayerSettings.productName;

	//ポップアップ用変数
	private static string[] BuildTypes = { 
		"MAC OS X", 	//0
		"Windows", 		//1
		"WebPlayer", 	//2
		"iOS",			//3
		"Android"		//4
	};

	[MenuItem("KitouSpecial/BuildSetting")]
	static void Open( ) {
		EditorWindow.GetWindow<BuildSetting>( "BuildSetting" );
	}

	void OnGUI( ) {

		//対象プラットフォーム選択
		buildTypeNum = EditorGUILayout.Popup("BuildType", buildTypeNum, BuildTypes);

		//フォルダネーム
		buildName = EditorGUILayout.TextField ("フォルダネーム", buildName);
	}
}
```

プラットフォームに関してはポップアップを使用して選択できるようにしています。これに関してはもっと楽な方法があると思いますが、この方法以外知らないのでこのやり方でいきます。
プラットフォームはもちろんまだまだありますが、ここでは代表的な５つを使っていきます。

<img width="321" alt="スクリーンショット 2016-11-19 13.57.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/143839/2f6a2311-8cc9-38d7-f9a6-5deedd426833.png">

こういう風になりました。

#出力先を決めよう

```ruby:BuildSetting.cs
//ビルド開始ボタン
	if (GUILayout.Button ("Build")) {
		//ビルド先
		string path = EditorUtility.OpenFolderPanel ("Build", "", "");
		string[] files = Directory.GetFiles (path);

        //名前がない場合に値を入れる。
        if ( buildName == "" ) {
            buildName = PlayerSettings.productName;
        }
        
        //ビルド
}
```

これをOnGUIの中に入れます。
ボタンを作り、*EditorUtility.OpenFolderPanel*でファイルブラウザでpathに出力先を入れます。

#ビルドをしてみる

まずはWindowsのみでビルドしていきたいと思います。
ここで追加したのはシーンリスト取得の関数を作成し、実際にビルドを走らせてます。

```ruby:BuildSetting.cs
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;

public class BuildSetting : EditorWindow {

	//対象プラットフォーム
	int buildTypeNum;

	//フォルダネーム
    string buildName = PlayerSettings.productName;

	//ポップアップ用変数
	private static string[] BuildTypes = { 
		"MAC OS X", 	//0
		"Windows", 		//1
		"WebPlayer", 	//2
		"iOS",			//3
		"Android"		//4
	};

	[MenuItem("KitouSpecial/BuildSetting")]
	static void Open( ) {
		EditorWindow.GetWindow<BuildSetting>( "BuildSetting" );
	}

	void OnGUI( ) {

		//対象プラットフォーム選択
		buildTypeNum = EditorGUILayout.Popup("BuildType", buildTypeNum, BuildTypes);

		//フォルダネーム
		buildName = EditorGUILayout.TextField ("フォルダネーム", buildName);

		//ビルド開始ボタン
		if (GUILayout.Button ("Build")) {
			//ビルド先
			string path = EditorUtility.OpenFolderPanel ("Build", "", "");
			string[] files = Directory.GetFiles (path);


            //名前がない場合に値を入れる。
            if ( buildName == "" ) {
                buildName = PlayerSettings.productName;
            }

			// ビルド
            string errorMessage = BuildPipeline.BuildPlayer(
                GetEnabledScenes( ),                // ビルド対象シーンリスト
                path + "/" + buildName + ".exe",    // 出力先
                BuildTarget.StandaloneOSXUniversal, // ビルド対象プラットフォーム
                BuildOptions.Development            // ビルドオプション
            );
		}
	}

	//シーンリスト取得
	static string[] GetEnabledScenes( ) {
		List<string> sceneList = new List<string>();

		// "Scenes In Build"に登録されているシーンリストを取得
		EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes;
		foreach( EditorBuildSettingsScene scene in scenes ) {
			// チェックがついているか確認
			if( scene.enabled ) {
				// リストに加える
				sceneList.Add( scene.path );
			}
		}

		// 配列にして返す
		return sceneList.ToArray();
	}
```

*BuildPipeline.BuildPlayer*　この関数でビルドを走らせることができます。
第三引数　*BuildTarget*リファレンス　→　[BuildTarget](https://docs.unity3d.com/ja/current/ScriptReference/BuildTarget.html)
第四引数　*BuildOptions*リファレンス　→　[BuildOptions](https://docs.unity3d.com/ja/current/ScriptReference/BuildOptions.html)

#プラットフォームを選択（完成）


```ruby:BuildSetting.cs
#プラットフォームを選択（完成）

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;

public class BuildSetting : EditorWindow {

	//対象プラットフォーム
	int buildTypeNum;

	//フォルダネーム
    string buildName = PlayerSettings.productName;

	//ポップアップ用変数
	private static string[] BuildTypes = { 
		"MAC OS X", 	//0
		"Windows", 		//1
		"WebPlayer", 	//2
		"iOS",			//3
		"Android"		//4
	};

	[MenuItem("KitouSpecial/BuildSetting")]
	static void Open( ) {
		EditorWindow.GetWindow<BuildSetting>( "BuildSetting" );
	}

	void OnGUI( ) {

		//対象プラットフォーム選択
		buildTypeNum = EditorGUILayout.Popup("BuildType", buildTypeNum, BuildTypes);

		//フォルダネーム
		buildName = EditorGUILayout.TextField ("フォルダネーム", buildName);

		//ビルド開始ボタン
		if (GUILayout.Button ("Build")) {
			//ビルド先
			string path = EditorUtility.OpenFolderPanel ("Build", "", "");
			string[] files = Directory.GetFiles (path);


            //名前がない場合に値を入れる。
            if ( buildName == "" ) {
                buildName = PlayerSettings.productName;
              }

			// ビルド
			BuildPlatform(buildTypeNum, path  );
		}
	}

	//シーンリスト取得
	static string[] GetEnabledScenes( ) {
		List<string> sceneList = new List<string>();

		// "Scenes In Build"に登録されているシーンリストを取得
		EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes;
		foreach( EditorBuildSettingsScene scene in scenes ) {
			// チェックがついているか確認
			if( scene.enabled ) {
				// リストに加える
				sceneList.Add( scene.path );
			}
		}

		// 配列にして返す
		return sceneList.ToArray();
	}

	//ビルドプラットフォーむ
	void BuildPlatform( int num, string path ) {
		if (num == 0) {
            //Windows
			string errorMessage = BuildPipeline.BuildPlayer(
				GetEnabledScenes( ),                // ビルド対象シーンリスト
				path + "/" + buildName + ".exe",  	// 出力先
                BuildTarget.StandaloneOSXUniversal, // ビルド対象プラットフォーム
				BuildOptions.Development            // ビルドオプション
			);
		} else if (num == 1) {
            //MacOS
			string errorMessage = BuildPipeline.BuildPlayer(
				GetEnabledScenes( ),                // ビルド対象シーンリスト
				path + "/" + buildName + ".exe",  	// 出力先
				BuildTarget.StandaloneWindows,      // ビルド対象プラットフォーム
				BuildOptions.Development            // ビルドオプション
			);
		} else if (num == 2) {
            //Webプレイヤー
			string errorMessage = BuildPipeline.BuildPlayer(
				GetEnabledScenes( ),                // ビルド対象シーンリスト
				path + "/" + buildName,         	// 出力先
                BuildTarget.WebPlayer,              // ビルド対象プラットフォーム
				BuildOptions.Development            // ビルドオプション
			);
		} else if (num == 3) {
            //iOS
			string errorMessage = BuildPipeline.BuildPlayer(
				GetEnabledScenes( ),                // ビルド対象シーンリスト
				path + "/" + buildName,  	        // 出力先
                BuildTarget.iOS,                    // ビルド対象プラットフォーム
				BuildOptions.Development            // ビルドオプション
			);
		} else if (num == 4) {
            //Android
			string errorMessage = BuildPipeline.BuildPlayer(
				GetEnabledScenes( ),                // ビルド対象シーンリスト
				path + "/" + buildName + ".apk",  	// 出力先
                BuildTarget.Android,                // ビルド対象プラットフォーム
				BuildOptions.Development            // ビルドオプション
			);
		}

	}
}
```

<img width="322" alt="スクリーンショット 2016-11-19 14.51.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/143839/416e9429-2fa4-72ec-774d-8c5cf8d16266.png">

すごく強引なやり方ですが、プラットフォーム別でビルドできました。

**注意**
buildNameに何も入ってなく、出力先が*.../Desktop*などで終わっているとデスクトップ上のものが全て消えるなど大変なことが起きるので気をつけて下さい。




**終わり**
これだけでは、全く意味のないウィンドウですが、応用すれば色々なことができそうです。

#参考
[コマンドラインからUnityのビルドを走らせる。 -基礎編-](http://qiita.com/sango/items/474efb4c016a136c84ce)