[unity]Addressablesのキー名でタイプミスを防ぐ

タイプミスはなくならない

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.ContainsResource 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 以前のことを思うとなんという進化か…。

日々ライブラリを更新し続けている開発者の方には、多謝。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA