タイプミスはなくならない
var handle = Addressables.LoadAssetAsync<Object>("filenam");
おっと、filename と打とうとして filenam と打ってしまった。
修正、修正っと…。
var handle = Addressables.LoadAssetAsync<Object>("filename");
すまないな、正しいキーネームは Filename なんだ。
ということで、こういったタイプミスが絶対に防げない事を、プログラムに長く従事すればするほど感じていることでしょう。
public class AddressablesConst { public const string Filename = "Filename"; }
var handle = Addressables.LoadAssetAsync<Object>(AddressablesConst.Filename);
こんな感じにしておけば、タイプミスもなくなるし、インテリセンスも使えて楽々です。
とはいえ、この Const クラスを作るのは面倒ですし、第一これも手動で作っていてはタイプミスは防げない。自動生成させたいですね。
それでもなくならない
プログラムの中に書く分には AddressablesConst でいいのですが、データ内でファイル名を直接指定するような場合(例えばテキストにファイル名が直接入っているとか)、この手は使えません。
仕方ないので Addressable.Contains(name) などで「ファイルがあったら読み込む、なかったら例外」としたいところ、生憎 Addressable にはそういうメソッドが直接的にはありません。
ResourceLocator を検索すれば出来なくはない。が、ちょっと面倒かつ、速度が不安
そんなわけで、Addressable に含めたアドレス名やキー名を HashSet に放り込んで、Contains で確認するようにします。そのコードも自動的に生成させます。
HashSetに放り込む段階で、ついでに、同一名が複数あった場合のエラーチェックも行います。
ダウンロード
使い方
ファイルを解凍して、Editor/ フォルダの下に置く
Tools > Addressable > Addressables Key List
AAS Group Directory
AAS の自動生成パスを変更してなければ、そのまま。変更している場合は、Addressables Groups の存在するパスを指定。
output path
出力するスクリプトファイルのパス。
コード例
AddressablesKey.Contains は Resource Locator の検索に比べ、およそ 9 倍ほどの速度でした。
とはいえ、500 ファイル検索で AddressablesKey.Contains は 1ms、Resource Locator は 9ms と、正直速度的にはどちらでもいいような気もします(作っておいてなんですが…)。
// 安心の const 指定 var handle = Addressables.LoadAssetAsync<Object>(AddressablesConst.test); handle.Completed += (op) => Debug.Log("load done."); // 数字はじまりの名前(0000)は、先頭に _ がつく var handle = Addressables.LoadAssetAsync<Object>(AddressablesConst._0000); // ハイフンなど、const に使えない文字を含んだ名前(test-0000)は、_ に置き換わる var handle = Addressables.LoadAssetAsync<Object>(AddressablesConst.test_0000); // 文字列指定。test があれば読み込み string key = "test"; if (AddressablesKey.Contains(key) == true) { var handle = Addressables.LoadAssetAsync<Object>(key); handle.Completed += (op) => Debug.Log("load done."); } else { Debug.LogError($"key not found. '{key}'"); }
パンがなければ、ケーキを作ればいいじゃない
ちょっとした部分で「もうちょっと…あと、もうちょっとおねがい…!」と AAS に望む気持ちも湧きますが、ないなら、作っちゃえばいいじゃない。ということで。
正直、AAS は Asset Bundle とは比べ物にならないほど便利で、快適です。
(Asset Bundle もベースとしてはよかったのですが、アプリ側で管理しなければならない部分がちょっと多かった)
なにより、10000 ファイル程放り込んで、ビルドで数時間かえってこなかった unity2017 以前のことを思うとなんという進化か…。
日々ライブラリを更新し続けている開発者の方には、多謝。