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