对象池模式经常用在频繁创建、销毁对象(并且对象创建、销毁开销很大)的场景。对象池模式管理一个可代替对象的集合。组件**从池中借出对象,用它来完成一些任务并当任务完成时归还该对象**。
被归还的对象接着满足请求,不管是同一个组件还是其他组件的请求。对象池模式可以管理那些代表的现实资源
或者通过重用来分摊昂贵初始化代价的对象。一般通过字典(Dictionary)来存储
using System.Collections;
using System.Collections.Generic;
using UnityEngine;namespace ns
{public interface IResetable{void OnReset();}public class GameObjectPool : MonoBehaviour{private Dictionary<string, List<GameObject>> cache;private void Awake(){cache = new Dictionary<string, List<GameObject>>();}public GameObject CreateObject(string key, GameObject prefab, Vector3 pos, Quaternion dir){GameObject go = FindUsableObject(key);if (go == null){go = Instantiate(prefab);Add(key, go);}UseObject(pos, dir, go);return go;}private void UseObject(Vector3 pos, Quaternion dir, GameObject go){go.transform.position = pos;go.transform.rotation = dir;go.SetActive(true);foreach (var item in go.GetComponents<IResetable>()){item.OnReset();}}private void Add(string key, GameObject go){if (!cache.ContainsKey(key)) cache.Add(key, new List<GameObject>());cache[key].Add(go);}private GameObject FindUsableObject(string key){if (cache.ContainsKey(key))return cache[key].Find(o => !o.activeInHierarchy);return null;}public void CollectObject(GameObject go){go.SetActive(false);}public void CollectObject(GameObject go,float delay){StartCoroutine(DelayCollect(go, delay));}private IEnumerator DelayCollect(GameObject go, float delay){yield return new WaitForSeconds(delay);CollectObject(go);}public void Clear(string key){foreach (var item in cache[key]){Destroy(item);}cache.Remove(key);}public void ClearAll(){List<string> keyList = new List<string>(cache.Keys);foreach (var item in keyList){Clear(item);} }}
}