Unity 对象池

来源:互联网 发布:制作mv视频软件 编辑:程序博客网 时间:2024/05/23 20:17

1.设计一个PoolManage思路: 已经加载在内存的物体,等下可能还要重复使用,通常的思路是想没用就destroy掉。在c++里面还好,用的是智能指针(高效率),不用考虑GC问题。但是在C#中要考虑 :GC回收问题。所以通常做法可以把它放在一个池子里面。等下次要用的时候再取出来。

所以有了:

第一步思路:private List _dormantObjects = new List(); //暂时包括可以存储不同类型的NPC游戏物体。

第二步思路:现在要考虑生成出来的物体:

publicGameObjectSpawnObject(GameObject_obj){GameObjecttempObject =null;if(_dormantObject.Count > 0){foreach(varobjin_dormantObject){if(obj.name == _obj.name)//如果池子有就直接获取,并移除池子里面对应的元素{tempObject = obj;_dormantObject.Remove(tempObject);returntempObject;}}}// 如果对象池里面没有就重新加载一个tempObject =GameObject.Instantiate(_obj)asGameObject;tempObject.name = _obj.name;returntempObject;}

第三步思路:生成的东西不用的时候放在池子里面。

publicGameObjectPoolManager;//父亲节点,把物体放在该空物体下面publicvoidDeSpawnObject(GameObject_object){_object.transform.parent = PoolManager.transform;_object.SetActive(false);_dormantObject.Add(_object);}

第四步:Npc物体不可能有无限大,所以设置一个最大的容量,当超过的时候就把对应先进到池子的就要移除。

publicint_Capacity;publicvoidTrimUnLiveObject(){while(_dormantObject.Count > _Capacity){GameObject_obj = _dormantObject[0];_dormantObject.RemoveAt(0);Destroy(_obj);}}

第五步:

现在这个基本完成对象池的概念:

但是还有几个问题:

1.这个池子没有能力控制自己的加载和卸载:此时就需要一个管理器。

2.完成了只有休眠的物体(active= false)的管理,(active = true)也需要管理起来。

3.在第四步上的设置了最大容量的_Capacity,但是假使场景有很多不同类型的NPC类型,但是在池子中某一种的NPC对应的对象比较多,这就导致其它的npc占得比较少。这样就可以把它们的类型分开。

针对以上设计:PoolManager池子管理(最顶层):下一层不同类型的池子SpawnPool(不同类型的池子),最底层 每一个NPC预制体Pool。层次如下

PoolManager—–>SpawnPool2——>PrefabsPool2(可多个)—->Prefabs2。

然后就可以制作一个对象池的基本流程.

0 0