かつて代官山らへんで働いてたengineerのUnityブログ

サーバサイドやってきたエンジニアがUnityとか触って遊ぶだけのブログ

【Unity】AssetBundleの自動ビルド化をやってみた【Jenkins】

AssetBundleの自動ビルドシステムを作ることになり
実際にやってみてのポイントなどを書いていく
ほとんど自分用メモです


■UnityはBatchModeオプションで起動する

/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -quit -projectPath $プロジェクトのパス/ -executeMethod ExportAssetBundles.AutoExportResource -logFile ./BuildTools/Log/build.log; cat ./BuildTools/Log/build.log

BatchModeオプションをつけることでUnityのエディタ自体を立ち上げないままメソッドを直接呼び出すことが出来る。
ビルドログの出力先もここで指定する。
ちなみにJenkinsからシェルを実行させるには設定の『ビルド手順の追加』から『シェルの実行』を選択してやると記述欄が出てくる

f:id:chroske:20150909214736p:plain



■テクスチャ素材のインポート設定を自動化する
テクスチャ素材によって設定が違ったりしたので、置かれるディレクトリ名で判別して自動設定されるようにした。

public class CustomImportSettings : AssetPostprocessor 
	{
		void OnPreprocessTexture() {
			Debug.Log("Importing texture to: " + assetPath);
			string[] pathSplitArrayData = assetPath.Split('/');

			List<Dictionary<string,string>> buildParamList = LoadCsv(AUTOBUILD_SETTING_CSV_PATH); //csv読み込みメソッド

			string textureType = "";
			string textureFormat = "";

			foreach(Dictionary<string,string> buildParam in buildParamList){
				if(Array.IndexOf(pathSplitArrayData, buildParam["resource_name"]) != -1) {
					textureType = buildParam ["texture_type"];
					textureFormat = buildParam ["texture_format"];
					break;
				}
			}

			TextureImporter textureImporter = assetImporter as TextureImporter;

			textureImporter.textureType = ManageTextureImportType.getTextureImporterType(int.Parse(textureType)); //int型のidからtextureTypeを取得するメソッド
			textureImporter.textureFormat = ManageTextureImportFormat.getTextureImporterFormat(int.Parse(textureFormat)); //int型のidからtextureFormatを取得するメソッド
		}
}

AssetPostprocessorクラスのOnPreprocessTextureメソッドを実装すると、画像がインポートされる瞬間に呼び出されて任意の処理を行うことが出来る。
assetPathで画像が置かれたパスを取得できるので、そこから設定を判別し、textureTypeとtextureFormatを設定する




■Jenkinsのワークスペースは2つ用意する
これはスマホゲームのようなマルチプラットフォーム対応のプロジェクトに限ったもの
御存知の通りUnityのSwitchPlatformは死ぬほど時間がかかる
そこで一つのJenkinsジョブに同一リポジトリワークスペースを2つ用意し、交互にビルドを行うことでSwitchPlatformをやらずにマルチプラットフォームのビルドが行える
実際これをやらないと数個のAssetBundleだとしてもAssetが多いプロジェクトならば15分とかはザラだ
もちろんほとんどSwitchPlatformにあてられた時間である

f:id:chroske:20150909214216p:plain
やり方はJenkinsの設定『ソースコード管理』から任意のバージョン管理を選択し、『ロケーションの追加』したあとにそれぞれ『ローカルモジュールディレクトリ』を設定してやるだけでいい




■自動化してみて
うちのプロジェクトでは何年も手動でAssetBundleを作っていたらしい
なんだよそれ、AssetBundle職人かよ
正直自分に引き継がれた時はコイツァは人間様のする仕事じゃねえ!!以外の感想は出てこなかった
そして自動化することを決めた、自分が幸せになり人間としての尊厳を取り戻すために
幸い自動化システムを作っているときはとても楽しかった
皆もガンガン自動化して人間は人間の尊厳を保った人間らしい仕事をしていこう