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
から解放することも忘れないようにしましょう。