Unity笔记-对象池管理器

对象池的概念

对象池:
预制体需要在特定场景里多次生成,销毁(如子弹)时,可以将使用完的预制体放到一个集合(对象池)里储存,下次使用不用重新生成,直接取出就好。如果对象池里没有对应的预制体,则再生成一个
一个对象池就是一个持有一些可循环利用对象的集合
当场景中需要对象池的预制体较多时,可能会需要多个对象池
所以,需要一个持有一些对象池的管理器:

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);
}
}
}