UnityでAddressablesを使ってPrefabのInstantiate
概要
UnityでAddressablesを使って、Prefabからオブジェクトを作成する方法を説明します。
環境
- Windows 11 22H2
- Unity 2021.3.15f
オブジェクトの生成
UnityでPrefabからGameObjectを生成したいことがあります。この方法のひとつとして、Addressablesアセットを利用した方法があります。
Addressablesアセットは、Unityが公式で配布している効率的なリソース管理をするものです。非同期で処理ができるなど、他の方法と比較して良いことがあります。
ここでは、Addressablesアセットを利用したPrefabでのゲームオブジェクトの作成方法を紹介します。
Addressablesアセットのインストール
Addressablesアセットは、Unityのプロジェクトに最初から含まれていません。そこで、Unity EditorのPackage Managerを利用してインストールします。
パッケージ名は「Addressables」ですので、間違えないようにしてインストールします。
これで、Addressablesを使う準備が終わりました。
Addressablesの使い方
Addressablesを利用してPrefabからゲームオブジェクトを生成する場合、あらかじめ設定をしておく必要があります。
Addressablesを利用して参照したいPrefabのInspectorから、Addressableにチェックを入れます。これで準備は終わりです。
チェックの横にあるAssets/Prefabs/Bullet.prefab
のような文字列で、Prefabを参照します。そのため、この文字列をコピペできるようにしておきます。
ここからは、C#のスクリプトで実際にゲームオブジェクトを作成する方法を説明します。
class Sample : MonoBehaviour
{
private AsyncOperationHandle<GameObject> bulletPrefabHundle;
private GameObject bulletPrefab;
public void Start()
{
// 非同期でPrefabを取得
bulletPrefabHundle = Addressables.LoadAssetAsync<GameObject>("Assets/Prefabs/Bullet.prefab");
// 非同期での処理について終了を待つ
bulletPrefab = bulletPrefabHundle.WaitForCompletion();
// Prefabからゲームオブジェクトの作成
Instantiate(bulletPrefab);
}
public void OnDestroy()
{
// Addressablesで取得したオブジェクトの後処理
Addressables.Release(bulletPrefabHundle);
}
}
Addressables.LoadAssetAsync
で、Addressablesを利用してPrefabを取得しています。引数には、Inspectorに書かれている文字列を利用します。これは非同期で呼び出されるものなので、WaitForCompletion
メソッドを利用して処理の終了を待ちます。
これで、Prefabの準備ができたので、Instantiate
でゲームオブジェクトを作成します。
注意点として、Addressablesで参照したオブジェクトは最後に自分の手で破棄する必要があります。今回はOnDestroy
メソッドを利用して、最後に破棄しています。
慣れてしまえばそれほど複雑な処理では無いと思います。
さいごに
私は最初、Addressables.Release
の実行する場所を間違えてしまったため、ゲームオブジェクトの生成ができないというバグに遭遇しました。すぐに直せるものと思っていたのですが、意外にも修正までに時間がかかりました。
このバグの複雑だったところは、Unity Editorでの実行時にはゲームオブジェクトを作成できたのですが、最終成果物としてビルドしたものを実行したときに、バグが再現されたということです。正直なところ、リソース管理について、バグが発生しやすいということを身をもって知りました。
この記事が、Addressablesの使い方の参考になれば嬉しいです。