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のプロセスが残ったままになってしまってうざい感じです。

インポートしてみる

ということで作成したパッケージをインポートしてみました。

f:id:DayBySay:20160322230856p:plain

指定したディレクトリ以下のファイルがすべてパッケージに含まれているのが確認できました。

まとめ

Unityのコマンドライン引数を使うと自動化が捗る。

あとは世の中のCIサービスがUnity対応してくれれば・・(;_;)