=========================
Unity对象池--加强版
结构:
1、大池子 GameObjectPool -- 存每一个小池子
2、小池子 SubPool -- 存游戏对象
主要使用两个方法spawn和unSpawn
=========================
Unity对象池--加强版
结构:
1、大池子 GameObjectPool -- 存每一个小池子
2、小池子 SubPool -- 存游戏对象
主要使用两个方法spawn和unSpawn
=========================
using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; /// <summary> /// 游戏对象池,所有类型的对象都由此管理器管理 /// 主要使用两个方法spawn和unSpawn /// </summary> public class GameObjectPool:SingletonMono<GameObjectPool> { //protected override void Awake() //{ // base.Awake();//千万别漏掉 //} //子对象池分类(子弹,怪物,特效等) Dictionary<string, SubPool> dicPools = new Dictionary<string, SubPool>(); /// <summary> /// 创建缓冲池对象 /// </summary> /// <param path="path">预制体路径,从Resource加载。路径是Resource文件夹下预制体的路径,如:GameObjectPool.Instance.spawn("NewPrefabs/bullet")</param> /// <returns></returns> public GameObject spawn(string path)//从池子中取对象 { if (!dicPools.ContainsKey(path))//如果没有子对象池 { createNewSubPool(path);//创建子对象池 } //获取子对象池 SubPool pool = dicPools[path]; return pool.spawn(); } /// <summary> /// 回收缓冲池对象 /// </summary> /// <param name="go"></param> public void unSpawn(GameObject go)//回收对象 { SubPool pool = null; foreach (SubPool p in dicPools.Values) { if (p.contains(go)) { pool = p; break; } } pool.unSpawn(go); } public void unSpawnAll()//回收所有对象 { foreach (SubPool p in dicPools.Values) { p.unSpawnAll(); } } //创建新的子对象池 private void createNewSubPool(string path) { GameObject goPrefab = Resources.Load<GameObject>(path); SubPool curPool = new SubPool(goPrefab,transform); //对象池名字即是goPrefab名字 dicPools.Add(path, curPool); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; /// <summary> /// 子对象池,用于管理一类对象 /// /// </summary> public class SubPool { GameObject goPrefab; //预制体 Transform transParent; //空物体 //子对象池中管理的所有对象 List<GameObject> listObjects = new List<GameObject>(); //构造函数 public SubPool(GameObject goPrefab, Transform transParent) { this.goPrefab = goPrefab; //根据预制体名字创建了一个空对象 GameObject goParent = new GameObject(goPrefab.name); goParent.transform.SetParent(transParent); this.transParent = goParent.transform; } /// 1:从容器中查找一个隐藏物体 /// 2:如果没有找到就克隆goPrefab预制体对象 public GameObject spawn() { GameObject go = null; foreach (GameObject tmp in listObjects) { if (!tmp.activeSelf) { go = tmp; break; } } //在容器中如果没有找到 if (go == null) { //从资源中读取 go = GameObject.Instantiate<GameObject>(goPrefab); go.transform.parent = transParent; listObjects.Add(go); } go.SetActive(true); go.SendMessage("spawn", SendMessageOptions.DontRequireReceiver); return go; } public void unSpawn(GameObject go) { if (contains(go)) { go.SendMessage("unSpawn", SendMessageOptions.DontRequireReceiver); go.SetActive(false); } } public void unSpawnAll() { foreach (GameObject go in listObjects) { if (go.activeSelf) { unSpawn(go); } } } public bool contains(GameObject go) { return listObjects.Contains(go); } } //通过对象池来生成一个游戏对象 Transform curBullet = GameObjectPool.Instance.spawn("NewPrefabs/bullet").transform; //回收对象 GameObjectPool.Instance.unSpawn(gameObject); ===================================================================================