跳至主要内容

NodePool

重要 注意 提醒

Coding Style wiki


NodePoolPoolSystem 的簡易 GameObject 物件池組件 (MonoBehaviour),以 Queue (先進先出) 管理閒置物件,支持異步分散幀加載 (負載平衡)自動增長 (Auto Put)最大數量限制 (Max Size);透過 Add Component -> OxGKit -> PoolSystem -> NodePool 掛載至場景節點上使用 (該節點即為物件池的容器節點)。

命名空間OxGKit.PoolSystem
類型public class NodePool : MonoBehaviour
原始碼NodePool.cs
using OxGKit.PoolSystem;

注意 分散幀加載基於 UniTask 實現,啟用時 Initialize異步分批建立物件,可透過 IsLoadFinished 確認完成時機。

快速上手

using OxGKit.PoolSystem;
using UnityEngine;

// 於 Inspector 指定場景上的 NodePool (已配置 Source GameObject)
public NodePool objPool;

// 手動初始物件池 (勾選 initializeOnStart 則會於 Start 自動初始)
this.objPool.Initialize();

// 從物件池取出並指定父節點 (池中無可用物件且未開啟 autoPut 時會回傳 null)
var go = this.objPool.Get(this.transform);

// 使用完畢歸還物件池
this.objPool.Put(go);

通用規則

生命週期

  1. 初始:勾選 initializeOnStart (預設) 會於 Start 自動呼叫 Initialize;取消勾選則自行決定初始時機。
  2. 取出/歸還:以 Get 取出物件 (自動 SetActive(true)),使用完畢以 Put 歸還 (自動 SetActive(false) 並歸位至池節點下)。
  3. 清空:組件 OnDestroy 時會自動呼叫 Clear,取消未完成的加載任務並銷毀池中物件。

重要 Source GameObject (go) 不能為空,未指定來源時初始物件池會擲出 ArgumentNullException;另外請勿自行 Destroy 池化物件,務必以 Put 歸還,否則物件池數量會逐漸縮減。

物件狀態重置

池化物件是重複使用的,Get 取出時不會重置物件狀態,請於物件的 OnEnable 或取出後自行重置 (例如速度、拖尾、協程等),切勿假設物件為全新實例化的狀態。

自動增長批次設定

注意 目前版本 (v1.0.2) 的自動增長 (Auto Put) 分散幀流程,「每生成 N 個物件」的批次數量沿用 initDelayFrameAfterSpawnCount 設定 (autoDelayFrameAfterSpawnCount 尚未被使用),延遲幀數則使用 autoPutDelayFrame

日誌輸出

本模組的日誌透過 LoggingSystem 輸出,日誌器名稱為 OxGKit.PoolSystem.Logger,可透過其配置開關與級別。


成員

成員說明
public GameObject go物件池的來源物件 (Inspector: Source GameObject),必填
public bool initializeOnStart是否於 Start 自動初始物件池 (預設 true)。
public int initSize物件池的初始數量 (預設 5)。
public bool initLoadAcrossFrames初始時啟用分散幀加載 (預設 true)。
public int initDelayFrameAfterSpawnCount初始時每生成 N 個物件後進行延遲 (預設 1,配置 <= 0 會自動修正為 1)。
public int initDelayFrame初始時每批延遲的幀數 (預設 1)。
public bool autoPut池中無可用物件時,是否自動增生 (預設 false)。
public int autoPutSize每次自動增生的數量 (預設 1)。
public bool autoPutLoadAcrossFrames自動增生時啟用分散幀加載 (預設 true)。
public int autoDelayFrameAfterSpawnCount自動增生時每生成 N 個物件後進行延遲 (預設 1,詳見自動增長批次設定)。
public int autoPutDelayFrame自動增生時每批延遲的幀數 (預設 1)。
public int maxSize物件池上限,0-1 為不限制,> 0initSizeautoPut 增生皆會受限 (預設 0)。

初始與管理

方法總覽

方法說明
Initialize初始物件池 (會先清空再依 initSize 重新建立)。
IsLoadFinished初始或自動增生的加載流程是否完成。
Count當前池中的閒置物件數量。
Clear清空物件池 (取消加載任務並銷毀池中物件)。

Initialize

public void Initialize()

初始物件池:會先呼叫 Clear 清空,再依 initSize 建立物件並放入池中 (maxSize > 0 時以 Min(initSize, maxSize) 為準);啟用 initLoadAcrossFrames 時,會以異步分散幀方式分批建立。

提醒 勾選 initializeOnStart 會於 Start 自動呼叫;重複呼叫等同於重建物件池。

// 手動初始物件池 (取消勾選 initializeOnStart 時)
this.objPool.Initialize();

IsLoadFinished

public bool IsLoadFinished()

回傳初始或自動增生的加載流程是否已完成;啟用分散幀加載時,建議在需要完整物件池的時機前 (例如大量生成前) 先行確認。

if (this.objPool.IsLoadFinished())
{
// 物件池已就緒
}

Count

public int Count()

回傳當前池中的閒置物件數量 (Get 取出會遞減、Put 歸還會遞增)。

int count = this.objPool.Count();

Clear

public void Clear()

清空物件池:取消尚未完成的加載任務,銷毀池中所有物件並將計數歸零;組件 OnDestroy 時會自動呼叫。

注意 清空僅會銷毀池中閒置物件,已被 Get 取出的物件不受影響;請留意功能關閉順序,物件池銷毀後不應再對其呼叫 Put


取出與歸還

方法總覽

方法說明
Get從物件池取出物件 (支持指定父節點、座標與旋轉)。
Put將物件歸還物件池 (超出 maxSize 會直接銷毀)。

Get

public GameObject Get()

public GameObject Get(Transform parent)

public GameObject Get(Transform parent, Vector3 position)

public GameObject Get(Transform parent, Vector3 position, Quaternion rotation)

從物件池取出物件並自動 SetActive(true)

  • 無參數:物件會脫離池節點 (父節點設為 null)。
  • parent:取出後掛至指定的父節點下。
  • position:設置物件的 localPosition (局部座標)
  • rotation:設置物件的 rotation (世界空間旋轉)

池中無可用物件時:

  • 已啟用 autoPutautoPutSize > 0 → 自動增生並返回物件 (即使開啟分散幀加載,第一個物件仍會同幀建立並立即返回)。
  • 未啟用 autoPut → 回傳 null呼叫端需自行判空

注意 position 設置的是 localPosition,會受父節點 Transform 影響;rotation 則為世界空間旋轉。

// 取出並指定父節點
var go = this.objPool.Get(this.transform);
if (go != null)
{
// 使用物件...
}

// 取出並指定父節點、局部座標與旋轉
var go2 = this.objPool.Get(parent, Vector3.zero, Quaternion.identity);

Put

public void Put(GameObject go)

將物件歸還物件池:自動歸位至池節點下並 SetActive(false);若 maxSize > 0 且池中數量已達上限,則直接銷毀該物件並輸出日誌提醒。

提醒 maxSize 統計的是池中閒置物件數量,場上使用中的物件歸還時若池已滿即會被銷毀,請以尖峰同時使用量評估上限。

// 使用完畢歸還物件池
this.objPool.Put(go);