【Unity】プレハブ用のオブジェクトプールを作ってみた

■このオブジェクトプールの特徴

よくあるオブジェクトを非アクティブ状態にしてプール。
プレハブのInstanceIDで管理するのでリストの登録が不要。
片方向リンクリストなので高速。
導入時のスクリプトの変更が少ない。
プール時だけ管理する為、普通にDestroyしても影響なし。
シーンに直接配置した場合はプールせずにDestroyする。
プレハブごとに初期化とプール時のイベントを登録。
オブジェクトプールマネージャのサンプルを付属。

ダウンロードはこちら
■ファイル構成

ObjectPool.cs :オブジェクトプール本体のスクリプト(シングルトン)
ObjectPoolItem.cs :プールしたいプレハブのルートに追加するスクリプト
ObjectPoolManager_sample.cs :プールする数を調整するスクリプトのサンプル
readme.txt :オブジェクトプールの説明

■使い方
  1. プレハブにObjectPoolItemコンポーネントを追加する。
  2. プレハブ生成はusing A_rosuko.ObjectPool;を追加して
    Instantiate(プレハブ, pos , qt);を下記に書き換えてください。
    ObjectPool.Instance.GetGameObject(プレハブ , pos , qt);
  3. プールはusing A_rosuko.ObjectPool;を追加して
    Destroy(gameObject);を下記に書き換える。
    ObjectPool.Instance.SleepGameObject(ObjectPoolItem);※ObjectPool.Instance.SleepGameObject(gameObject);でも動作しますが、
    内部でGetConponent<ObjectPoolItem>()してますのでObjectPoolItemをキャッシュして渡す方が速いです。
  4. 初期化などが必要であればエディタのインスペクターからOnEventWakeUpやOnEventSleepイベントに関数を登録してください。
■仕組み

オブジェクトプール本体のDictionaryでリンクリストの先頭を作成する。
DictionaryのキーはプレハブのInstanceIDとする。
各オブジェクトのObjectPoolItemコンポーネント側で接続するリンクリストの先頭をキャッシュしておき、先頭の次に接続する。
プールから取り出す時はリンクリストの先頭の次から取り出し、その次を先頭に接続しなおす。

■保証及び責任、著作権について

本ソフトウェアは無保証です。
本ソフトウェアの使用を通して生じたいかなる損害、不利益に対しても、制作者は責任を負わないものとします。

ObjactPool:Copyright 2018 A_rosuko
Released under the MIT license

■参考

Unity公式チュートリアル(第01回 オブジェクトプーリング)
Unityマニアックス(第1章オブジェクトプーリング)
wikipedia(Object pool pattern)

投稿者: A_rosuko

Unityでゲームを作ってます。 LightwaveメインでAfterEffects、SubstancePainter、ZBrush等を使ってます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です