コマンドラインからUnityのビルドを走らせる。 -基礎編-

# 概要
「Unityのビルドを自動化したい」と思うことありますよね。

え。[Cloud Build](http://build.cloud.unity3d.com/)があるから不要…？

まぁそう仰らずに…。

ちょっと長くなるので「基礎編」と「ステップアップ編」に分けて綴っていきます。


# 手順
残念ながら外からのコマンドだけでは実現できないみたい。
なので、Unityコード側と呼び出し側両方の手順を書いていくよ。

## Unity側
### ビルド用クラスを作成

Editorフォルダの下に、好きな名前のクラスを用意してね。

```csharp:BuildClass.cs
using UnityEditor;
using UnityEngine;

public class BuildClass
{
	public static void Build()
	{
		// ビルド対象シーンリスト
		string[] sceneList = {
			"./Assets/scene/title.unity",
			"./Assets/scene/game.unity",
			"./Assets/scene/config.unity"
		};


		// 実行
		string errorMessage = BuildPipeline.BuildPlayer(
				sceneList,							//!< ビルド対象シーンリスト
				"C:/project/bin/myUnityProj.exe",	//!< 出力先
				BuildTarget.StandaloneWindows,		//!< ビルド対象プラットフォーム
				BuildOptions.Development			//!< ビルドオプション
		);


		// 結果出力
		if( !string.IsNullOrEmpty( errorMessage ) )
			Debug.LogError( "[Error!] " + errorMessage );
		else
			Debug.Log( "[Success!]" );
	}
}

```
簡潔に仕上げるとこんな感じかな？

### 解説
大事なのは「クラス名」と「関数名」、それから「BuildPipeline.BuildPlayerの引数」かな。

「クラス名」と「関数名」は好きな名前をつけて良いけど、呼び出し側で使うから、覚えておいてね！

#### BuildPipeline.BuildPlayer
ビルドを走らせる為の関数だよ。

引数は、

<table>
<tr style="width:100%;"><th></th><th></th><th style="text-align:center;">型</th><th style="text-align:center;">説明</th></tr>
<tr><td>第一</td><td>levels</td><td>string[]</td><td>ビルドに含めるシーン(.unity)のパスリストだよ。<br>※プロジェクトフォルダからの相対パスで指定してね。</td></tr>
<tr><td>第二</td><td>locationPathName</td><td>string</td><td>ビルド成果物の出力先だよ。<br>※相対パスで指定した場合はプロジェクトフォルダが基点になるよ。</td></tr>
<tr><td>第三</td><td>target</td><td><a href="http://docs.unity3d.com/ja/current/ScriptReference/BuildTarget.html">BuildTarget</a></td><td>ビルド対象のプラットフォームを指定してね。<br>※次回起動時のプラットフォームもこの値に書き換わってしまうので注意が必要だよ。</td></tr>
<tr><td>第四</td><td>options</td><td><a href="http://docs.unity3d.com/ja/current/ScriptReference/BuildOptions.html">BuildOptions</a></td><td>ビルドに際してのオプション。<br>詳しくはリファレンスを見てね。</td></tr>
</table>
だよ！

## 呼び出し側
### スクリプト記述

#### Windows向け
```bat:build.bat
"C:\Program Files\Unity\Editor\Unity.exe" -batchmode -quit -logFile .\build.log -projectPath C:\project\myUnityProj -executeMethod BuildClass.Build
```

#### Mac向け
```shell-session:build.sh
/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -quit -logFile ./build.log -projectPath ~/project/myUnityProj -executeMethod BuildClass.Build
```

### 解説
<table>
<tr><th style="text-align:center;">引数</th><th style="text-align:center;">説明</th></tr>
<tr><td>-batchmode</td><td>Unityをバックグラウンドで起動するよ。</td></tr>
<tr><td>-quit</td><td>処理が終わったら自動で終了するよ。</td></tr>
<tr><td>-logFile</td><td>ログの出力先を指定してね。<br>※ログが不要な場合はこのオプションも不要だよ。</td></tr>
<tr><td>-projectPath</td><td>プロジェクトフォルダのパスを指定してね。</td></tr>
<tr><td>-executeMethod</td><td>実行する「クラス名」と「関数名」を指定してね。</td></tr>
</table>

とっても簡単ね！

## 実行
Unity側と呼び出し側の準備が終わったら、Unityを閉じて、呼び出し側のスクリプトを実行してみてね！

`BuildPipeline.BuildPlayer` に渡した `locationPathName` の場所に成果物が生成されていたら成功だよ！
※成果物は `BuildTarget` の指定によって異なるよ。 (`StandaloneWindows`なら`.exe`, `Android`なら`.apk`とか。)

実行中に警告音が鳴ったり、処理が終わっても成果物が生成されていなかったら `-logFile` で指定したログを見てみてね。
きっと解決のヒントが記載されているよ！

ありがちなのは、

- (Unity側)`levels`のパス指定が間違っている
- (呼び出し側)`-projectPath`が間違っている
- `BuildTarget.Android`を指定したけどSDKのパスが指定されていない

とか。

<br>
使いこなせればJenkins化とかもできるからきっと便利だよ！
(^o^)/

# 参考
- [Unity - スクリプトリファレンス: BuildPipeline.BuildPlayer](http://docs.unity3d.com/ja/current/ScriptReference/BuildPipeline.BuildPlayer.html)
- [Unity - マニュアル:  コマンドライン引数](http://docs.unity3d.com/ja/current/Manual/CommandLineArguments.html)


# シリーズ
- [コマンドラインからUnityのビルドを走らせる。 -ステップアップ編-](http://qiita.com/sango/items/582468d3038330c59308)