首先先创建一个对象池用于管理,这个对象池可以不用继承与MonoBehaviour,这样做可以节约资源,如果想了解更多的可以自行百度
public class ObjectPool {
private static ObjectPool instance;
private ObjectPool()
{
pool = new Dictionary<string, List<GameObject>>(); //初始化对象池字典
prefabs = new Dictionary<string, GameObject>(); //初始化预制体字典
}
public static ObjectPool GetInstance//防止没有创建对象池和预制体字典
{
get
{
if (instance == null)
{
instance = new ObjectPool();
}
return instance;
}
}
/// <summary>
/// 对象池字典
/// </summary>
private Dictionary<string, List<GameObject>> pool;
//预制体
private Dictionary<string, GameObject> prefabs;
//从对象池中获取对象
public GameObject GetObj(string objName)
{
GameObject result = null;
if (pool.ContainsKey(objName)) //判定该字典是否有这个名字的对象池
{
if (pool[objName].Count > 0) //判定对象池里面的对象是否大于0
{
result = pool[objName][0]; //获取结果
result.SetActive(true); //激活对象
pool[objName].Remove(result); //从池中移除对象
return result;
}
}
GameObject prefab = null;
if (prefabs.ContainsKey(objName))
{
prefab = prefabs[objName];
}
else //如果没有加载预制体
{
//加载预制体
prefab = Resources.Load<GameObject>("Prefabs/" + objName);
//更新字典
prefabs.Add(objName, prefab);
}
result = UnityEngine.Object.Instantiate(prefab); //生成预制体
result.name = objName;
return result;
}
//回收对象池
public void RecycleObj(GameObject obj)
{
obj.SetActive(false);
if (pool.ContainsKey(obj.name))
{
pool[obj.name].Add(obj);
}
else
{
pool.Add(obj.name, new List<GameObject>() { obj });
}
}
}
当写好了这个对象池脚本时就可以调用他了,他里面一共提供了两种方法,一种是生成物体,与在对象池中取物体,还有一种就是把物体放回池内,以便循环使用。
这时候,如果想要生成物体就可以调用GetObj(string objName)方法,传入是参数是生成物体的名字。
例如:
public class KindCube : MonoBehaviour {
GameObject go;
private void Start()
{
}
void Update () {
if (Input.GetMouseButtonDown(0))
{
go = ObjectPool.GetInstance.GetObj("Cube");
go.transform.parent = transform;
go.SetActive(true);
}
}
}
最后一步就是放回池里面的,这个脚本必须挂载在物体本身上
public class RecycleObj : MonoBehaviour {
void Start () {
}
private void OnEnable()
{
StartCoroutine(AutoRecyle());
}
void Update () {
}
IEnumerator AutoRecyle()
{
yield return new WaitForSeconds(3f);
ObjectPool.GetInstance.RecycleObj(gameObject);
}
}
这样一个对象池就做完了。