(:3[kanのメモ帳]

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

(:3[kanのメモ帳]

Addressable Assetsのアドレスとラベルを管理する定数クラスを自動生成する【Unity】【Addressable Assets】【エディタ拡張】


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


この記事でのバージョン
Unity 2018.4.8f1
Addressables 1.2.4


はじめに

Addressable Assets System(AAS)はアセットのロード時にアドレス(文字列)を用います。

一応、AssetReference等を使って、文字列を使わない使用しない方法もありますが、

f:id:kan_kikuchi:20190925055148j:plain


場合によってはアドレスで指定したい場合もあります。

そんな時に、アドレスを直接入力してしまうと打ち間違いが発生してしまうかもしれませんし、

アドレスの変更への対応もしにくいです。


という事で今回は、アドレスを(とついでにラベルも)管理する定数クラスを自動作成してみました。


イメージとしては以下のようなアドレスの定数が列挙された定数クラスを自動で作成&更新し、

手入力をなくすと言った感じ。

f:id:kan_kikuchi:20190929050255j:plain
//定数クラスを使って、Keyを指定してロード
 Addressables.LoadAssetAsync<GameObject>(AddressableAssetAddress.CAMERA).Completed +=  op => { 
  Debug.Log(op.Result.name);
};


ちなみに、以前Resourcesでも同じようなものを作っていました。





AddressableAssetAddressClassCreator

さっそくAddressable Assetsのアドレスとラベルを管理する定数クラスを自動生成するクラス

AddressableAssetAddressClassCreatorのコードです。



ちなみに以前紹介したConstantsClassCreatorも使っています。

ただし、以前のはコードが微妙に違うので、↑のやつを使ってください。



この2つをEditorに作成した後、

f:id:kan_kikuchi:20190925061941j:plain


AddressableAssetAddressClassCreator.csの上部にあるEXPORT_DIRECTORY_PATH

定数クラスを生成するディレクトリへのパスを指定します。

//定数クラスを生成するディレクトリのパス
private static readonly string EXPORT_DIRECTORY_PATH = "Assets/Scripts";
f:id:kan_kikuchi:20190929052431j:plain


なお、AddressableAssetsDataディレクトリの位置を変更した場合は

TARGET_DIRECTORY_PATHも合わせて修正する必要があります。

//変更をチェックするディレクトリのパス
private static readonly string TARGET_DIRECTORY_PATH = "Assets/AddressableAssetsData/AssetGroups";
f:id:kan_kikuchi:20190929052445j:plain


これでAddressable Assetを更新した時に

アドレスの定数クラスであるAddressableAssetAddressと、

f:id:kan_kikuchi:20190925063353j:plain


ラベルの定数クラスであるAddressableAssetLabel自動作成&更新されるようになります。

ただし、ラベルは実際に設定されているものだけが定数になります。

f:id:kan_kikuchi:20190925063403j:plain


また、Tools/CreateAddressableAsset Constants Classから手動で更新する事も可能です。

f:id:kan_kikuchi:20190925062325j:plain


使い方はロード時にこれら2つの定数クラスを使うだけ。

直接入力がなくなりますし、アドレス変更時にエラーが出るようにもなります。

//定数クラスを使って、Keyを指定してロード
 Addressables.LoadAssetAsync<GameObject>(AddressableAssetAddress.CAMERA).Completed +=  op => { 
  Debug.Log(op.Result.name);
};



おわりに

直接入力は地味に面倒ですし、結構気付きにくいバグの原因にもなるので出来る限り避けて、

今回のように定数クラス、それも出来れば自動生成するようにすると良いと思います。


あとは自動でAddressable Assets化出来ればかなり運用が楽になるのですが、それはまた別のお話(記事)。