スマゲ

スマートなゲームづくりを目指して日々精進

Unityでシンプルなオブジェクトプール

ソースコード
以下のクラスをUnityプロジェクトに追加する
gist.github.com

使い方

任意のタイミングでこのクラスのインスタンスを作成する
引数はプールしたいオブジェクトのプレハブ

_pool = new ObjectPool(_targetPrefab);

オブジェクトを利用するときはこのインスタンスから取得する

var newObject = _pool.Get();

不要になったオブジェクトはdisableにする

newObject.SetActive(false);
Sphereオブジェクトを使い回すサンプル

f:id:sanukin39:20190214230019g:plain
ObjectPool
サンプルコード

using System.Collections;
using UnityEngine;

public class Sample : MonoBehaviour
{
    [SerializeField] private GameObject _targetPrefab = null;
    private ObjectPool _pool;

    void Start()
    {
        _pool = new ObjectPool(_targetPrefab);
    }

    void Update()
    {
        var newObject = _pool.Get();
        newObject.transform.position = Vector3.zero;
        StartCoroutine(DisableObject(newObject, 0.5f));
    }

    IEnumerator DisableObject(GameObject target, float delaySeconds)
    {
        yield return new WaitForSeconds(delaySeconds);
        target.SetActive(false);
    }
}
注意点
  • 取得したオブジェクトはDestroyしない
  • プール対象のオブジェクトにアタッチされているMonoBehaviourのAwake, Startは生成時のみに呼び出されるため、初期化など取得するたびに行いたい処理はOnEnableなどに記述するか、直接呼ぶようにする