一共分為兩個類,SubPool與ObjectPool,SubPool類為總對象池包含ObjectPool的子池子,ObjectPool包含需要入池的對象。
調用方法:
- 入池:ObjectPool.Instance.Spawn()
- 出池:ObjectPool.Instance.UnSpawn()
- 全部出池:ObjectPool.Instance.UnSpawnAll()
- 銷毀池子:ObjectPool.Instance.DisPool();
SubPool類(繼承至單例父類)
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class SubPool
{
List<GameObject> Pool=new List<GameObject>();
/// <summary>
/// 入池
/// </summary>
public GameObject Spawn(string obj)
{
foreach (GameObject item in Pool)
{
if (!item.activeSelf)
{
item.SetActive(true);
item.SendMessage("Spawn",SendMessageOptions.DontRequireReceiver);
return item;
}
}
GameObject go = CreateObj(obj);
Pool.Add(go);
go.SendMessage("Spawn",SendMessageOptions.DontRequireReceiver);
return go;
}
/// <summary>
/// 出池
/// </summary>
/// <param name="go"></param>
public void UnSpawn(GameObject go=null,string goname="")
{
if (go!=null)
{
go.SetActive(false);
}
else
{
for (int i = 0; i < Pool.Count; i++)
{
if (Pool[i].activeSelf)
{
Pool[i].SetActive(false);
return;
}
}
}
}
/// <summary>
/// 全部出池
/// </summary>
public void UnSpawnAll()
{
foreach (GameObject item in Pool)
{
item.SetActive(false);
}
}
/// <summary>
/// 創建對象
/// </summary>
GameObject CreateObj(string obj)
{
GameObject go = GameObject.Instantiate(Resources.Load("Prefabs/Others/"+obj) as GameObject);
go.transform.SetParent(GameObject.Find("Pool").transform, false);
go.name = go.name.Replace("(Clone)", "");
return go;
}
}
ObjectPool類
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Framework;
public class ObjectPool:Manager<ObjectPool>
{
ObjectPool()
{
}
Dictionary<string,SubPool> pools= new Dictionary<string, SubPool>();
/// <summary>
/// 入池
/// </summary>
/// <param name="obj">創建的對象名</param>
public GameObject Spawn(string obj)
{
if (pools.ContainsKey(obj))
{
return pools[obj].Spawn(obj);
}
else
{
SubPool sp = new SubPool();
var go = sp.Spawn(obj);
pools.Add(obj, sp);
return go;
}
return null;
}
/// <summary>
/// 出池
/// </summary>
/// <param name="go">需要出池對象</param>
public void UnSpawn(GameObject go=null,string goName="")
{
if (!go)
{
if (pools.ContainsKey(goName))
{
pools[goName].UnSpawn(null,goName);
}
}
else
{
if (pools.ContainsKey(go.name))
{
pools[go.name].UnSpawn(go);
}
}
}
/// <summary>
/// 全部出池
/// </summary>
/// <param name="pool">出池的名稱</param>
public void UnSpawnAll(string pool)
{
if (pools.ContainsKey(pool))
{
pools[pool].UnSpawnAll();
}
}
/// <summary>
/// 銷毀池子
/// </summary>
/// <param name="pool">銷毀池的名稱</param>
public void DisPool(string pool)
{
if (pools.ContainsKey(pool))
{
pools.Remove(pool);
}
}
}