Unity には unitypackage という便利な機能があるが、下記の点において不満がある。
- 任意のパスへインポートできない
- 該当プロジェクトをエディタで開いていると、コマンドラインでインポートできない
そこで、unitypackage のインポート処理を独自で行うことで、これらの不満を解消してみる。
(以下の方法は Unity のバージョンアップにより利用できなくなる可能性がある。)
コマンドラインでインポート
unitypackage は下記のようにコマンドラインでもインポート可能だが、複数の Unity プロセスが同一のプロジェクトへアクセス出来ないため、既に該当プロジェクトを Unity エディタで開いている場合エラーとなる。
/Application/Unity/Unity.app/Contents/MacOS/Unity \
-projectPath /path/to/unity/project \
-importPackage customassets.unitypackage \
-batchmode \
-nographics \
-logfile unitypackage.log \
-quit
unitypackage を解凍する
unitypackage は tar.gz 形式なので下記のように解凍できる。
mkdir -p customassets
tar -zxpf customassets.unitypackage -C customassets
unitypackage の構造を知る
解答した unitypackage は下記の様に、guid をディレクトリとして、アセット・メタファイル・パス名 が格納されている。
% tree customassets/
customassets/
├── 1b3a955b14cc44f0a85525b74c5cc194
│ ├── asset
│ ├── asset.meta
│ └── pathname
├── 4df8e2426febb471384bf16a4b17d070
│ ├── asset
│ ├── asset.meta
│ └── pathname
└── fe642c8c33bb64f4c88acc0a9c594584
├── asset
├── asset.meta
└── pathname
個々のアセットを pathname を元にコピーする
unitypackage の構造がわかったので、pathname に格納されているパス名を元に asset, asset.meta をコピーします。
このパス名を修正することでインポート先を変更したり、インポートするアセットをフィルタリングすることが出来る。
また、Unity のコマンドを使わないので、プロジェクトをエディタで開いていても実行できる。
rm -rf Assets/CustomAssets
for guid in `cd customassets && ls`; do
path=`cat customassets/${guid}/pathname | sed -e 's/^Assets\/Plugins\//Assets\/CustomAssets\/Plugins\//`
mkdir -p `dirname $path`
cp customassets/${guid}/asset $path
cp customassets/${guid}/asset.meta ${path}.meta
done