この記事でのバージョン
Unity 2018.2.17f1
はじめに
今回はタイトル通りUnitypackageの使い方(インポート)や作り方(エクスポート)、
プログラムでの操作方法をまとめてみた感じの記事です。
Unitypackageとは
そもそもUnitypackageとはなんぞやという話ですが、マニュアルには以下のように書かれています。
ゲームを作成する際、Unity はアセットに関する多くのメタデータを格納します (インポート設定、その他のアセットへのリンクなど)。アセットを異なるプロジェクトに移したい場合、特定の方法があります。次の方法で、この情報をすべて保ちつつ、プロジェクト間でアセットを簡単に移動できます。
簡潔にまとめると
「Unitypackageとはメタデータを保ちつつ、他のプロジェクトにアセットを移動するためのもの」
という感じでしょうか。
ちなみにメタデータというのは
Unityのプロジェクト上で何らかのファイルを生成した時に自動生成されるもので、
そのアセットの色々な設定や他のアセットへのリンクが保存されているデータの事です。
(Unityエディタ上では見えない)
このメタデータがなくなると設定などが初期状態に戻ってしまうため、
Unitypackageが使われるわけなんです。
ちなみにUnity Asset Storeのアセット配信にもUnitypackageが使われています。
使い方(インポート)
Unitypackageをインポートしたい時はProject上で右クリックをし、
Import Package -> Custom PackageでUnitypackageファイルを選ぶだけ。
もしくはUnitypackageをダブルクリックしてUnityエディタで開いても大丈夫です。
Unitypackageを開くとインポート出来るファイル一覧が表示され、
必要がないものはチェックを外し、インポートしないという事も可能です。
また、新規ファイルにはNewマーク、ファイルの更新には回転マーク、
同名で違うファイルにはビックリマークで警告が表示されます。
なお、既に更新済みのファイルは表示されません。
作り方(エクスポート)
Unitypackageを作りたい場合はパッケージに含めたい物を選択(複数選択も可)した状態で、
右クリック -> Export Packageを実行し、
開いたウィンドウ上でパッケージに含めたいものを選ぶ感じです。
この時、Include dependenciesを有効にしていると
選択したScene、もしくはPrefabで使っているものも一緒にパッケージに入れる事が出来ます。
なお、シーンが保存されていない(右上にアスタリスクが出ている)状態だと、
保存される前の状態でエクスポートされてしまうので注意が必要です。
同様に、Prefabも変更した後にちゃんとApplyで反映させてからエクスポートしましょう。
プログラムでの操作方法
Unitypackageをプログラムで操作したい場合はAssetDatabaseを使います。
プログラムでインポート
プログラムでインポートしたい時はAssetDatabase.ImportPackageを以下のような感じで使います。
//第一引数でインポートしたいパッケージのパスを指定、第二引数でダイアログを出すかを指定 AssetDatabase.ImportPackage("Sample.unitypackage", interactive:false);
上記のようにファイル名だけを指定すると、プロジェクト直下(Assetsと同じ所)という事になります。
また、第二引数をfalseにする事でダイアログを表示せずに即インポートする事も可能です。
プログラムでエクスポート
プログラムでエクスポートしたい時はAssetDatabase.ExportPackageを以下のような感じで使います。
//Unitypackageに含めるアセットへのパス string[] assetPaths = { "Assets/Cube.asset", "Assets/NewBehaviourScript.cs", }; //Unitypackageを作成する場所へのパス(プロジェクト直下、Assetsと同じ所) string exportPath = "Sample.unitypackage"; //オプション ExportPackageOptions options = ExportPackageOptions.Default; //Unitypackageを作成 AssetDatabase.ExportPackage(assetPaths, exportPath, options); //Unitypackageに含めるアセットが一つしかない場合は、第一引数をそのアセットのパスにしてもOK //AssetDatabase.ExportPackage("Assets/NewBehaviourScript.cs", exportPath, options);
なお、オプション(ExportPackageOptions)には以下の5種類があり、
複数同時に使いたい場合はORで結合します。
- Default : 指定したファイルのみをパッケージに含める
- Interactive : エクスポートが完了したら、パッケージを(MacならFinderで)表示する
- Recurse : 指定したディレクトリの中身もパッケージに含める
- IncludeDependencies : 指定したアセット(PrefabはScene)が依存するアセットもパッケージに含める
- IncludeLibraryAssets : プロジェクトの設定(LibraryやProjectSettingsなど)もパッケージに含める
ExportPackageOptions options = ExportPackageOptions.Interactive | ExportPackageOptions.IncludeLibraryAssets;
ちなみにエクスポート先に同名のファイルがあったら強制的に上書きされますし、
エクスポートするファイルがなければエラーが出ます。
(Prefabだけ指定&オプションがDefaultみたいな時も入れるものがないのでエラーになる)
UnityException: Could not find any assets to export
インポート時のイベント
AssetDatabaseにはUnitypackageインポート時のイベントも用意されています。(エクスポート時のはない)
ただ、ちょっと試してみた感じキャンセルは機能してないようでした。
[InitializeOnLoad]//エディター起動時に初期化されるように public static class UnitypackageExporter { //コンストラクタ(InitializeOnLoad属性によりエディター起動時に呼び出される) static UnitypackageExporter() { AssetDatabase.importPackageCompleted += ImportCompleted; AssetDatabase.importPackageCancelled += ImportCancelled; AssetDatabase.importPackageFailed += ImportCallBackFailed; AssetDatabase.importPackageStarted += ImportStarted; } private static void ImportStarted(string packageName) { Debug.Log(packageName + "のインポート開始"); } private static void ImportCancelled(string packageName) { Debug.Log(packageName + "のインポートキャンセル"); } private static void ImportCallBackFailed(string packageName, string _error) { Debug.Log(packageName + "のインポート失敗 : " + _error); } private static void ImportCompleted(string packageName) { Debug.Log(packageName + "のインポート完了"); } }