(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

Unitypackageの使い方(インポート)や作り方(エクスポート)、プログラムでの操作方法【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加



この記事でのバージョン
Unity 2018.2.17f1


はじめに

今回はタイトル通りUnitypackageの使い方(インポート)や作り方(エクスポート)、

プログラムでの操作方法をまとめてみた感じの記事です。


Unitypackageとは

そもそもUnitypackageとはなんぞやという話ですが、マニュアルには以下のように書かれています。

ゲームを作成する際、Unity はアセットに関する多くのメタデータを格納します (インポート設定、その他のアセットへのリンクなど)。アセットを異なるプロジェクトに移したい場合、特定の方法があります。次の方法で、この情報をすべて保ちつつ、プロジェクト間でアセットを簡単に移動できます。


簡潔にまとめると

「Unitypackageとはメタデータを保ちつつ、他のプロジェクトにアセットを移動するためのもの」

という感じでしょうか。


ちなみにメタデータというのは

Unityのプロジェクト上で何らかのファイルを生成した時に自動生成されるもので、

そのアセットの色々な設定や他のアセットへのリンクが保存されているデータの事です。

(Unityエディタ上では見えない)


f:id:kan_kikuchi:20181215110115j:plain


このメタデータがなくなると設定などが初期状態に戻ってしまうため、

Unitypackageが使われるわけなんです。


ちなみにUnity Asset Storeのアセット配信にもUnitypackageが使われています。


f:id:kan_kikuchi:20181215110449j:plain



使い方(インポート)

Unitypackageをインポートしたい時はProject上で右クリックをし、

Import Package -> Custom PackageでUnitypackageファイルを選ぶだけ。

もしくはUnitypackageをダブルクリックしてUnityエディタで開いても大丈夫です。


f:id:kan_kikuchi:20181215112245j:plain


Unitypackageを開くとインポート出来るファイル一覧が表示され、

必要がないものはチェックを外し、インポートしないという事も可能です。


また、新規ファイルにはNewマーク、ファイルの更新には回転マーク、

同名で違うファイルにはビックリマークで警告が表示されます。


f:id:kan_kikuchi:20181215112305j:plain


なお、既に更新済みのファイルは表示されません。


f:id:kan_kikuchi:20181215112637j:plain


作り方(エクスポート)

Unitypackageを作りたい場合はパッケージに含めたい物を選択(複数選択も可)した状態で、

右クリック -> Export Packageを実行し、


f:id:kan_kikuchi:20181215112737j:plain


開いたウィンドウ上でパッケージに含めたいものを選ぶ感じです。

この時、Include dependenciesを有効にしていると

選択したScene、もしくはPrefabで使っているものも一緒にパッケージに入れる事が出来ます。


f:id:kan_kikuchi:20181215112920j:plain


なお、シーンが保存されていない(右上にアスタリスクが出ている)状態だと、

保存される前の状態でエクスポートされてしまうので注意が必要です。


f:id:kan_kikuchi:20181215113020j:plain


同様に、Prefabも変更した後にちゃんとApplyで反映させてからエクスポートしましょう。


f:id:kan_kikuchi:20181215113106j:plain


プログラムでの操作方法

Unitypackageをプログラムで操作したい場合はAssetDatabaseを使います。





プログラムでインポート

プログラムでインポートしたい時はAssetDatabase.ImportPackageを以下のような感じで使います。

//第一引数でインポートしたいパッケージのパスを指定、第二引数でダイアログを出すかを指定
AssetDatabase.ImportPackage("Sample.unitypackage", interactive:false);


上記のようにファイル名だけを指定すると、プロジェクト直下(Assetsと同じ所)という事になります。


f:id:kan_kikuchi:20181215114445j:plain


また、第二引数を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

f:id:kan_kikuchi:20181215115746j:plain


インポート時のイベント

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 + "のインポート完了");
  }

}

f:id:kan_kikuchi:20181215122517j:plain