コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Unity 2021 から標準で使用できるようになったオブジェクトプールの使用例

スクリプト

上記のスクリプトをシーンのゲームオブジェクトにアタッチして実行すると
オブジェクトプールの動作を確認できます

実行例

プールにオブジェクトが不足している場合は新規で生成されます
プールに非アクティブなオブジェクトが存在する場合は
新規で生成せずに非アクティブなオブジェクトをアクティブにします

プールの最大数 maxSize を超えて生成されたオブジェクトは
プールに戻されずに削除されます

ObjectPool.Clear でプールをリセットできます

collectionCheck について

m_objectPool = new ObjectPool<GameObject>
(
    createFunc: CreatePooledItem,
    actionOnGet: OnTakeFromPool,
    actionOnRelease: OnReturnedToPool,
    actionOnDestroy: OnDestroyPoolObject,
    collectionCheck: true, // ★
    defaultCapacity: 10,
    maxSize: 10
);

ObjectPool のコンストラクタで collectionCheck に true を指定した場合、

m_objectPool.Release( gameObject );
m_objectPool.Release( gameObject );

すでにプールに戻されているオブジェクトをプールに戻そうとすると

InvalidOperationException: Trying to release an object that has already been released to the pool.

上記のエラーが発生するようになります(Unity エディタでのみ)

collectionCheck に false を指定すると、すでにプールに戻されているオブジェクトを
プールに戻そうとしてもエラーは発生しなくなります

GC Alloc について

オブジェクトプールを使用しても GC Alloc は発生しなかった
(1.5 KB 発生している GC Alloc は OnGUI によるもの)

参考サイト様

検証プロジェクト