【Unity】【Addressable】Unity Addressable Importerでアドレスの設定を自動化する

Unity Addressable Importerを使ってAddressableアセットシステムのアドレス設定を自動化する方法です。

Unity2019.3.5

はじめに

Addressableアセットシステムを使用すると一意で任意のアドレスによりアセットを管理できます。
これは便利なのですが、各アセットにアドレスを割り振る必要が出てきます。

これは人間のやる作業ではないのでAssetPostprocessorやらで自動化することになりますが、
アドレスを自動で割り振るための便利なOSSであるUnity Addressable Importerを発見したので紹介します。

github.com

これをつかうと下図のような設定ファイルに定義したルールに基づいて、
アドレスやグループ、ラベルの設定を自動化することができます。

f:id:halya_11:20200409232118p:plain
ルール設定の一例

なおAddressableについてはセットアップが完了している前提で説明を進めます。
Addressableの概念やセットアップ方法については必要に応じて以下の記事を参照してください。

light11.hatenadiary.com

インストールとセットアップ

インストールとセットアップは以下の手順で行います。

インストール

Unity Addressable Importerをインストールするにはmanifest.jsonのDependenciesにリポジトリ情報を追加します。

{
    "dependencies": {
        "com.littlebigfun.addressable-importer": "https://github.com/favoyang/unity-addressable-importer.git"
    }
}

上記を追加してからUnityを立ち上げることでインストールが行われます。
ちなみに初回のインストール時に自動的にインストールしたバージョンのコミット情報がmanifest.jsonに書き込まれます。

  "lock": {
    "com.littlebigfun.addressable-importer": {
      "revision": "HEAD",
      "hash": "25821426686726730e723abe617301c23ea29e84"
    }
  }

アップデートをしたい場合にはここを書き換えるか、もしくはこの記述を削除してインストールしなおせばOKです。

セットアップ

インストールが完了したら、次にセットアップを行います。
まずAssets > Create > Addressables > Import Settingsを選択します。

f:id:halya_11:20200408234627p:plain
セットアップメニュー

するとAddressableImportSettingsというScriptableObjectが生成されるので、
これをAssets > AddressableAssetsData配下に配置します。

f:id:halya_11:20200408234804p:plain
AddressableAssetsData以下に配置

ルールを決める

前節で作成したAddressableImportSettingsのInspectorを見ると下図のように表示されることが確認できます(RulesのSizeは1にしています)。

f:id:halya_11:20200409215712p:plain
AddressableImportSettingsのInspector

以下、このScriptableObjectを編集することでアドレスの設定ルールを決めていきます。

対象アセットを決める

まず対象となるアセットを決めます。 アセットはRuleのPathにアセットパスを入力することで指定します。

f:id:halya_11:20200409220632p:plain
Pathを入力

ここでMatch TypeをWildcardにすると*で任意の複数の文字を、?で任意の1文字を指定できます。
つまり例えば以下のような指定が可能になります。

  • Asset/Prefabs/Character_??/*.prefab

またMatch TypeをRegexにすると正規表現を使ってパスを指定できます。
つまり例えば以下のような指定が可能になります。

  • Assets/Prefabs/Character_[0-9]{2}/.*.prefab

実際にはこのようにワイルドカード正規表現を用いてRuleを作っていくケースが多くなると思います。

グループを設定する

次にアセットが所属するグループを決めます。
グループを設定するには、Group Nameにグループ名を入力するだけです。
ちなみに空欄にした場合にはデフォルトのグループに追加されます。

f:id:halya_11:20200409222309p:plain
グループ名を入力

グループ名を${PATH[0]}のように指定すると、アセットパスの一部をグループ名として使用できます。
例えば以下のように設定した場合にはCharacter_xxというフォルダ名がグループ名になります。

f:id:halya_11:20200409225140p:plain
パスの一部をグループ名に使う

ちなみにインデックスに負の値を指定すると「末端からルートに向かって何番目のフォルダか」を指定できるので、以下の設定でも上記と同じ結果が得られます。

f:id:halya_11:20200409225349p:plain
インデックスに負の値を指定

さらにMatch TypeをRegexにしている場合、正規表現の名前付きグループを使ってグループ名を指定することもできます。
名前付きグループは(?<name>)のように指定します(詳しくはこちらのドキュメントを参照)。

f:id:halya_11:20200409230154p:plain
正規表現の名前付きグループを使用

ここで、Allow Group Creationにチェックを入れている場合には、指定したグループがなかった時に新しくグループが作られます。
また、Remove Empty Groupsにチェックを入れると所属するアセットが無いグループが削除されます。

f:id:halya_11:20200409222716p:plain
Allow Group Creation / Remove Empty Groups

さらにGroup TemplateにAddressableAssetGroupTemplateを設定するとグループ生成時にこのテンプレートに基づいてグループの設定が行われます。
またGroup Template Application ModeをAlways Overwrite Group Settingsにするとグループ新規生成時以外(更新時)にもこのテンプレートの設定が適用されます。

f:id:halya_11:20200409222835p:plain
テンプレートの設定

ラベルを設定する

さて次にラベルを設定します。
ラベルの設定方法はシンプルで、Label Refsに付けたいラベルを指定するだけです。

f:id:halya_11:20200409230650p:plain
ラベルを指定

このとき、Label ModeがAddだと今設定されているラベルに追加され、Replaceだと今設定されているラベルが削除されて置き換えられます。

f:id:halya_11:20200409230753p:plain
Label Mode

アドレスを設定する

さてこのようにして選択されたアセットにはアドレスが設定されます。
原則として、アドレスにはアセットパスがそのまま設定されます。
大体のケースではこれで問題ないのではないかと思いますが、下記のようにアドレスに変更を加えることもできます。

Address Simplifiedにチェックを入れた場合、拡張子なしのファイル名がアドレスとなります。

f:id:halya_11:20200409231518p:plain
Address Simplified

またAddress Simplifiedのチェックを外し、かつMatch TypeをRegexにしている場合にはAddress Replacementが設定できるようになります。
例えば以下のように設定すると、Prefabs_Character_01のようなアドレスが設定されます。

f:id:halya_11:20200409231825p:plain
Address Replacement

ルールの適用タイミングについて

このようにして作られたルールはアセットのインポートや移動のタイミングで適用されます。

もしインポート後に適用したい場合にはフォルダを右クリックしてAddressablesImporter: Check Folder(s)を選択します。
Reimportしてもいいのですが、こっちの方が無駄な処理が走らない分高速です。

参考

github.com