Addressablesとは?
AddressablesはUnityが提供する、ゲーム内のアセットを効率的に管理、ロードするためのシステムです。
PrefabをAddressablesに登録する
検証用に適当なCubeを用意し、Prefabとして保存しました。

インスペクタからAddressablesに登録し、Cubeと名前を変えます。

PrefabをAddressablesから読んでくる
適当なスクリプトを用意して、Updateメソッド内で以下の様に書いてみました。
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
var handle = Addressables.LoadAssetAsync<GameObject>("Cube");
handle.Completed += (operation) =>
{
Instantiate(handle.Result);
};
}
}

Cubeが生成されるようになりました。
Addressables.LoadAssetAsync<GameObject> でアセットを読んできます。
通常通りhandle.ResultをInstantiateすることでPrefabを生成できます。
ロードを事前に済ませておいても同様の結果になります。
private AsyncOperationHandle<GameObject> _cubeHandle;
private void Start()
{
_cubeHandle = Addressables.LoadAssetAsync<GameObject>("Cube");
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Instantiate(_cubeHandle.Result);
}
}
InstantiateAsyncを使う
Addressables.InstantiateAsyncメソッドを使用して非同期で生成することが出来ます。
InstantiateAsyncの場合はロードからInstantiateまで行われるため、
Completedが呼ばれた際には、生成済みのGameObjectを取得できます。
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
var handle = Addressables.InstantiateAsync("Cube");
handle.Completed += (operation) =>
{
var go = handle.Result;
// goに対して何らかの処理を行う
};
}
}
通常のInstantiateのように、座標や回転を与えたり、親Transformを指定することも出来ます。
var handle = Addressables.InstantiateAsync("Cube", new Vector3( 1f, 5f, 0f), Quaternion.identity);
解放するには?
生成したGameObjectが不要になった場合は、
通常通りDestroyメソッドに渡せばシーン上から削除できます。
Destroy(gameObject);
ですがAddressables上には参照が残っておりそのままでは解放されません。
ロード時に返ってきたHandleを使って以下の様に解放しましょう。
// Unity2021以降
handle.Release();
// もしくは、こちらでも可
Addressables.Release(handle);
ちゃんと解放しておかないと、メモリリークとなり、
何度も繰り返しているとメモリが確保できなくなります。
まとめ
今回はAddressablesでPrefabを読み込む場合について解説しました。
ロード自体は通常のアセットと同じですが、直接Instantiateするメソッドも用意されています。
生成したGameObjectはDestroyで削除できますが、
Release()でAddressablesから解放することも忘れないようにしましょう。
🗒️次の記事
📣おしらせ!
Unity Asset Storeで GROW YOUR GARDEN セール が開催中です。
農業関係のアセットなどが最大50%OFFでセール中です。