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」ですので、間違えないようにしてインストールします。

image-3-1024x727.png

これで、Addressablesを使う準備が終わりました。

Addressablesの使い方

Addressablesを利用してPrefabからゲームオブジェクトを生成する場合、あらかじめ設定をしておく必要があります。

Addressablesを利用して参照したいPrefabのInspectorから、Addressableにチェックを入れます。これで準備は終わりです。

image-41.png

チェックの横にある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の使い方の参考になれば嬉しいです。