UnityUnityUnity笔记-对象池管理器
Wang ChenHan对象池的概念
对象池:
当预制体需要在特定场景里多次生成,销毁(如子弹)时,可以将使用完的预制体放到一个集合(对象池)里储存,下次使用不用重新生成,直接取出就好。如果对象池里没有对应的预制体,则再生成一个
一个对象池就是一个持有一些可循环利用对象的集合
当场景中需要对象池的预制体较多时,可能会需要多个对象池
所以,需要一个持有一些对象池的管理器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| using... //对象池 public class PoolStack { //集合 public Stack<UnityEngine.Object> stack = new Stack(Object)(); public int MaxCount = 100;//最大个数 //把游戏物体放入对象池 public void Push(UnityEngine.Object object){ if(stack.Count<MaxCount){ stack.Push(object); }else{ GameObject.Destroy(object); } } //从对象池取出一个游戏物体 public UnityEngine.Object Pop(){ if(stack.Count > 0){ return stack.Pop(); } return null; } public void Clear(){ foreach(UnityEngine.Object go in stack){ GameObject.Destroy(go); stack.Clear(); } } } public class PoolManager { //单例类的一些操作...此处不详写 可以阅读Unity笔记-泛型单例 //管理多个池子 Dictionary<string,PoolStack> poolDic = new Dictionary<string,PoolStack>(); //从对象池取出对象,没有则创建一个 public UnityEngine.Object Spawn(string poolName UnityEngine.Object prefab){ //没有对象池则创建 if(!poolDic.CoutainsKey(poolName)){ poolDic.Add("poolName",new PoolStack()); } //从池子中拿出一个 UnityEngine.Object go = poolDic[poolName].Pop(); if(go==null) go = GameObject.Instantiate(prefab); return go; } //清空 public void UnSpawn(string poolName){ if(poolDic.ContainsKey(poolName)){ poolDic[poolName].Clear(); poolDic.Remove(poolName); } } }
|