コマンドラインからUnityのビルドを走らせる。 -ステップアップ編-

# 概要
[前回](http://qiita.com/sango/items/474efb4c016a136c84ce)に引き続きコマンドラインからUnityのビルドするやーつです。

今回はもう少しステップアップして、こんなことも出来ますよっていうお話を綴ります。

# ステップアップ編

## * 引数を取得する

`System.Environment.GetCommandLineArgs();`
を使うとUnityに与えられた引数を取得できるよ！

### サンプル
#### 呼び出し側
```bat:build.bat
"C:\Program Files\Unity\Editor\Unity.exe" -batchmode -quit -logFile .\build.log -projectPath C:\project\myUnityProj -executeMethod BuildClass.Build /platform Android /name ichigo /partner seira
```

Unity側で読み取る用に、 `/platform Android` `/name ichigo` `/partner seira` の3つを追記してみたよ。
<br>

#### Unity側
```csharp:BuildClass.cs
	BuildTarget platform = BuildTarget.StandaloneWindows;

	// 引数取得
	string[] args = System.Environment.GetCommandLineArgs();

	int i, len = args.Length;
	for( i = 0; i < len; ++i )
	{
		switch( args[i] )
		{
			case "/name":
				Debug.Log( "Name : " + args[i+1] );     // "ichigo"
				break;

			case "/partner":
				Debug.Log( "Partner : " + args[i+1] );  // "seira"
				break;

			case "/platform":
				platform = (BuildTarget)System.Enum.Parse( typeof(BuildTarget), args[i+1] );
				break;
		}
	}
```

読み取るコードはこんな感じ。

### 参考
- [Environment.GetCommandLineArgs メソッド (System)](https://msdn.microsoft.com/ja-jp/library/system.environment.getcommandlineargs(v=vs.110).aspx)

<br>
## * ビルド対象シーンを `Scenes In Build` から自動で抽出する

↓ `Scenes In Build` ってコレのこと！
![ss_111.png](https://qiita-image-store.s3.amazonaws.com/0/97611/4bac0518-365a-42b4-ef21-95856826d346.png)

### サンプル
こんな感じの関数を追加したよ。

```csharp:BuildClass.cs
System.Collections.Generic;

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` の第一引数をこの関数に置き換えてね！

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

```

<br>
## * ビルド後にプラットフォーム設定を元に戻す
`BuildPipeline.BuildPlayer` を実行すると、次回起動時も対象プラットフォームの指定が切り替わったままになっちゃうけど、
それを元に戻すための施策を紹介するよ。
### サンプル
```csharp:BuildClass.cs
    // 現在の設定を控える
    BuildTarget prevPlatform = EditorUserBuildSettings.activeBuildTarget;

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

    // 元に戻す
    EditorUserBuildSettings.SwitchActiveBuildTarget( prevPlatform );
```

ベタだけどこんな感じで実現できるよ！

### 参考
- [Unity - Scripting API: EditorUserBuildSettings.activeBuildTarget](http://docs.unity3d.com/ScriptReference/EditorUserBuildSettings-activeBuildTarget.html)
- [Unity - Scripting API: EditorUserBuildSettings.SwitchActiveBuildTarget](http://docs.unity3d.com/ScriptReference/EditorUserBuildSettings.SwitchActiveBuildTarget.html)

<br>
## * プラットフォーム毎の設定を変更する
### PlayerSettings
プラットフォームに関する設定等には `PlayerSettings` を使うよ。
項目が多いので比較的使用頻度が高そうなものをピックアップするよ！

<table>
<tr><th style="text-align:center;">プロパティ</th><th style="text-align:center;">説明</th></tr>
<tr><td>productName</td><td>アプリ名だよ。<br>スマホの場合はアイコンと一緒に表示される名前になるよ。</td></tr>
<tr><td>bundleVersion</td><td>アプリのバージョンだよ。<br>例 : 1.0.6.192</td></tr>
<tr><td>shortBundleVersion</td><td>アプリバージョンの簡易表示だよ。<br>例 : 1.0</td></tr>
<tr><td>bundleIdentifier</td><td>iOSの場合はBundle Identifier、<br>Androidの場合はパッケージ名にあたるよ。</td></tr>
<tr><td>Android.keystoreName</td><td>使用するキーストアファイル名を指定できるよ。</td></tr>
<tr><td>Android.keystorePass</td><td>↑のパスワードを指定できるよ。</td></tr>
<tr><td>Android.keyaliasName</td><td>使用するキーエイリアス名を指定できるよ。</td></tr>
<tr><td>Android.keyaliasPass</td><td>↑のパスワードを指定できるよ。</td></tr>
<tr><td>Android.useAPKExpansionFiles</td><td>実行バイナリを分割し.apkと.obbを生成するようにするかを指定できるよ。</td></tr>
<tr><td>Android.bundleVersionCode</td><td>DeveloperConsoleで必要なバージョンコードを指定できるよ。</td></tr>
<tr><td>iOS.targetDevice</td><td>対応するiOSデバイスを指定できるよ。</td></tr>
</table>

### サンプル
```csharp:BuildClass.cs
// 設定
PlayerSettings.productName        = "カツアイ！";
PlayerSettings.bundleVersion      = "2.1.0.18";
PlayerSettings.shortBundleVersion = "2.1";
PlayerSettings.bundleIdentifier   = "com.starlight.katsuai";

// 実行
string errorMessage = BuildPipeline.BuildPlayer( /* 以下略 */
```
<br>
### 参考
- [Unity - スクリプトリファレンス: PlayerSettings](http://docs.unity3d.com/jp/current/ScriptReference/PlayerSettings.html)
- [Unity - マニュアル: Standalone Player Settings](http://docs.unity3d.com/jp/current/Manual/class-PlayerSettingsStandalone.html)
- [Unity - マニュアル: Android Player Settings](http://docs.unity3d.com/jp/current/Manual/class-PlayerSettingsAndroid.html)
- [Unity - マニュアル: iOS Player Settings](http://docs.unity3d.com/jp/current/Manual/class-PlayerSettingsiOS.html)
- [Unity - マニュアル: Webplayer Player Settings](http://docs.unity3d.com/jp/current/Manual/class-PlayerSettingsWeb.html)


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