前篇 : Object Pool 的小練習.
插件下載點 : 20200615_ObjectPool
這天放假, 就把它做到 Plugin API 級別.
為了支援完全動態生成, 加上了 PoolManager 也優化了一點內存, 及兼顧了 Photon 的接合, 不過主體思路沒有甚麼改變.
不過代碼及測試有點多就不分享代碼, 改為直接發包了.
插件下載點 : 20200615_ObjectPool
檔案 Import 後附有三個測試 Scene
- TestPoolIdDuplicate
- TestPoolLimitControl
- TestShooting
ObjectPool 功能
- 支援預載 Preload prefab.
- 個別預載設定 : 每個 Prefab -> PrefabSetting
- 延時預載
- 預載間隔單位:幀
- 預載物件數量
- 延遲 Awake() :- 到第一次呼叫 Spawn()
- 動態建立物件池
- PoolManager.GetOrCreatePool(“Name”);
- 相同名稱時自動修改 GameObject.name 維持名稱的單一性.
- Spawn()
- 使用 預載設定的字串 為參數 – 用作跨網同步 (e.g. photon)
- 使用 Prefab – GameObject 為參數
- 可指定物件為父系層級
- 可以動態更改於 ObjectPool 中的 PrefabSetting
- PrefabSetting
- 指定物件池的容量 = 產生上限
- 達到上限時忽略 Spawn 要求 -> 回傳 Null
- Despawn 時的設定
- Despawn()
- PrefabSetting
- 停留在目前父層級 或 回收並成為 ObjectPool 子物件
- PrefabSetting
- ObjectPool.IsSpawned(GameObject)
- 檢查物件是否被已被物件池產生
- 擴展用的 ISpawnObject
- OnSpawned 廣播(Broadcast)
- OnDespawned 廣播(Broadcast)
預先做的兩個常用 ISpawnObject 的小工具
- SelfDespawn.cs 是在特定時間後自動銷毀 Despawn 的工具
- DespawnOnCollision.cs 是在接觸到的 Trigger / Collider 後會觸發銷毀的工具
- 可指定某個 GameObject.tag 符合才觸發.