【Unity】Unity公式のObjectPoolのサンプル

オブジェクトプールデザインパターンをUnityで実現するためのクラスが用意されていますので、サンプルで確認してみましょう

この例では、指定されたプレハブからオブジェクトプールを作成し、スペースキーを押すとオブジェクトがプールから取得され、ランダムな位置にアクティブになります。また、トリガーコライダーとの衝突が検出された場合、オブジェクトはプールに返されます。

このように、オブジェクトプールを使用することで、オブジェクトの生成と破棄のオーバーヘッドを回避し、パフォーマンスを向上させることができます。

シーン構成

スクリプト

using UnityEngine;
using UnityEngine.Pool;

public class ObjectPoolExample : MonoBehaviour
{
    public GameObject prefab;  // プールするゲームオブジェクトのプレハブ
    public int poolSize = 10;  // プールするオブジェクトの初期サイズ

    private ObjectPool<GameObject> objectPool;  // ゲームオブジェクトのプール

    private void Start()
    {
        // オブジェクトプールの作成
        objectPool = new ObjectPool<GameObject>(
            createFunc: () => Instantiate(prefab),          // プールが空のときに新しいインスタンスを生成する処理
            actionOnGet: obj => obj.SetActive(true),        // インスタンスがプールから取り出されたときに呼び出される処理
            actionOnRelease: obj => obj.SetActive(false),   // インスタンスがプールに戻されるときに呼び出される処理
            actionOnDestroy: null,                          // プールがmaxSizeに達した際、要素をプールに戻せなかったときに呼び出される処理
            collectionCheck: false,                         // プールに戻す際に既に同一インスタンスが登録されているか調べ、あれば例外を投げる。エディタでのみ実行されることに注意
            defaultCapacity: poolSize,                      // デフォルトの容量
            maxSize: 100);                                  // プールの最大サイズ
    }

    private void Update()
    {
        // スペースキーが押されたらオブジェクトをプールから取得してアクティブにする
        if (Input.GetKeyDown(KeyCode.Space))
        {
            GameObject obj = objectPool.Get();
            // 半径5m以内のエリアにランダムに3Dベクトルの座標を取得
            obj.transform.position = Random.insideUnitSphere * 5f;
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        // 衝突したオブジェクトをプールに返す
        if (other.CompareTag("Poolable"))
        {
            objectPool.Release(other.gameObject);
        }
    }
}

GameObject obj = objectPool.Get();

objectPoolという名前のオブジェクトプールからオブジェクトを取得し、objという変数に格納しています

objectPool.Release(other.gameObject);

オブジェクトプールにオブジェクトを返します。これにより、オブジェクトが再利用可能な状態に戻ります
サンプルでは、衝突したオブジェクトを再利用のためプールに戻しています

Random.insideUnitSphere

UnityのRandomクラスの静的メソッドであり、ランダムな3Dベクトルを生成するために使用されます。このメソッドは、単位球内のランダムな点を表すVector3オブジェクトを返します。

具体的には、Random.insideUnitSphereは、中心が原点で半径が1の単位球内のランダムな点を返します。このメソッドは、ランダムな方向と距離を持つベクトルを生成するためによく使用されます。

実行結果

スペースキーを押下することで、Cubeのプレファブだインスタンス化されます
ヒエラルキーにCube(Clone)が増えていくのがわかります
Sceneウィンドウで球を摘んでCubeに衝突させると、消失(実態としては、SetActive(false))します
再度、Gameウィンドウでスペースキーを押下すると消失させたプールのオブジェクトが発生(実態としては、SetActive(true))します