Unityのコマンドライン引数を使ってパッケージ作成を自動化する
皆さんこんばんは。 思いが強くなりすぎて二郎を食べに新潟まで行ったDayBySayです。
本日はUnity用のプラグインを配布する際に使われるパッケージ(.unitypackage
)作成を自動化する方法について書いていきます。
概要
Unityを用いて開発をされている方はご存知だと思いますが、Unityの世界では便利なライブラリやSDKなどをパッケージとして固めて利用する事がよくあると思います。
作られたパッケージは下記のようにAsset Store経由で配布されたり、GitHub上にホスティングされていたりと、配布方法はいくつか有りますが、形式はほとんどが.unitypackage
形式だと思います。
基本的には、UnityのGUIを用いてパッケージの出力で作成することが可能ですが、これでは人為的ミスが入り込む余地が残ります。
そこで、今回はこの.unitypackage
をの作成を、コマンドライン引数を用いて自動化したいと思います。
docs.unity3d.com
環境
Unity 5.3.2f1
Mac OSX 10.10.5
Projectのディレクトリ構造
$ ls
Assets Library Makefile ProjectSettings README.md
$ tree Assets/ Assets/ ├── Editors │ ├── MyEditor.cs │ └── MyEditor.cs.meta ├── Editors.meta ├── Plugins │ ├── MyPlugin.cs │ └── MyPlugin.cs.meta ├── Plugins.meta ├── Scripts │ ├── MyScript.cs │ └── MyScript.cs.meta └── Scripts.meta
リポジトリ
リポジトリは下記です。 github.com
実装
今回はこんな感じで実装しました。
UNITY_CLI?=/Applications/Unity/Unity.app/Contents/MacOS/Unity LOG_FILE?=unity.log PROJ_PATH?=$(shell pwd) PACKAGE_NAME?=MyPlugin.unitypackage EXPORT_PACKAGES:= Assets/Editors Assets/Plugins Assets/Scripts .PHONY: package all: package: $(UNITY_CLI) \ -exportPackage $(EXPORT_PACKAGES) $(PACKAGE_NAME) \ -projectPath $(PROJ_PATH) \ -batchmode \ -nographics \ -logfile $(LOG_FILE) \ -quit
オプションの説明
-exportPackage と -projectPath
-exportPackage
は名前の通りファイル(ディレクトリ)をパッケージとしてエクスポートするためのオプションで、対象のプロジェクトを-projectPath
で指定する必要があります。
パッケージに含める際に指定するディレクトリは、-projectPath
で指定したプロジェクトから相対パスになります。
今回は-exportPackage Assets/Editors Assets/Plugins Assets/Scripts
となるように指定していますが、今回のディレクトリ構造においては-exportPackage Assets
と等価です。
ちなみに-exportPackage
はディレクトリのみ指定できます(ドキュメントをよく読まずファイルを指定しようとしてハマりました・・哀
-batchmode と -nographics
-batchmode
を設定することで、GUIを使わず実行でき、-nographics
を設定することでグラフィックデバイスの初期化をしないため、GPUを積んでいないマシンでの実行が可能になります。
Unityを介した処理の自動化を行う場合は、基本的にこの2つのオプションを設定することになると思います。
-logfile
-logfile
で実行結果をファイルに書きだしています。
成功しようが失敗しようがここにログが吐かれます。
-quit
バッチ処理終了後に自動でUnityを終了します。
これをしておかないと、処理完了後にUnityのプロセスが残ったままになってしまってうざい感じです。
インポートしてみる
ということで作成したパッケージをインポートしてみました。
指定したディレクトリ以下のファイルがすべてパッケージに含まれているのが確認できました。
まとめ
Unityのコマンドライン引数を使うと自動化が捗る。
あとは世の中のCIサービスがUnity対応してくれれば・・(;_;)