虽然有 优缺点 但是在很多游戏制作中 我们还是很喜欢使用缓存池 unity 有个插件Poolmanager 还可以 挺好使的。但是代码量过于庞大。
所以自己依照这个原理做了一个简单的prefab缓存池。代码量比较少。
using UnityEngine; using System; using System.Collections; using System.Collections.Generic; public enum PoolType{ None, Skill, UI, Other } public class Pool{ public PoolType Tp = PoolType.None; public double CurTime = 0; public string PoolName = ""; //缓存池的名字 public List<GameObject> Spawnls = new List<GameObject>(); //显示列表 public List<GameObject> DeSpawnls = new List<GameObject>(); //显示列表 public GameObject Spawn(){ //从缓存中取 if(DeSpawnls.Count > 0){ GameObject o = DeSpawnls[0]; Spawnls.Add(o); DeSpawnls.RemoveAt(0); return o; }else{ return null; } } public void Despawn(GameObject obj){ //进入缓存(在改进入缓存的调用不要Destroy哦,一般用卸载来进行统一的Destroy) Spawnls.Remove(obj); DeSpawnls.Add(obj); } public GameObject CreatePrefab(GameObject o){ //创建 GameObject obj = GameObject.Instantiate(o); obj.name = o.name; Spawnls.Add(obj); return obj; } public void CleanAll(){ for(int i = 0; i<Spawnls.Count; i++){ GameObject.Destroy(Spawnls[i]); } for(int i = 0; i<DeSpawnls.Count; i++){ GameObject.Destroy(DeSpawnls[i]); } Spawnls.Clear(); DeSpawnls.Clear(); } } public class PoolManager{ public static Dictionary<string,Pool> PoolDic = new Dictionary<string,Pool>(); //总缓存 public static int CheckUnloadTime = 30;//最大未使用并要清理的时间间隔 static public double getTimeMilliseconds(DateTime time){ if(time == null){ time = DateTime.Now; } return time.Subtract(DateTime.Parse("1970-1-1")).TotalMilliseconds; } public static void UnLoadPool(string name){//卸载某个缓存池的所有引用 Pool pool = null; if(PoolDic.TryGetValue(name,out pool)){ pool.CleanAll(); } } public static void CheckPool(){ //自动清理调用 double curTime = getTimeMilliseconds(DateTime.Now); foreach(KeyValuePair<string,Pool> pool in PoolDic){ if(curTime - pool.Value.CurTime > CheckUnloadTime * 1000){ UnLoadPool(pool.Key); } } } static public GameObject GetPrefabFromCachePool(GameObject o,Transform parent,PoolType type){ //获取prefab的缓存 Pool pool = null; GameObject newObj = null; if(o != null){ string name = o.name; if(PoolDic.TryGetValue(name,out pool)){ newObj = pool.Spawn(); if(newObj == null){ newObj = pool.CreatePrefab(o); }else{ //成功 } }else{ pool = new Pool(); pool.PoolName = name; pool.Tp = type; newObj = pool.CreatePrefab(o); PoolDic.Add(name,pool); } if(parent != null){ newObj.transform.SetParent(parent); } pool.CurTime = getTimeMilliseconds(DateTime.Now); }else{ Debug.LogError("o is null"); } return newObj; } }