一、单个对象池单元
using System.Collections.Generic;
using UnityEngine;
using System;
[Serializable]
public class GameObjectPool {
[SerializeField]
public string name;
[SerializeField]
private int maxNum;
[SerializeField]
private GameObject prefab;
[NonSerialized]
private List<GameObject> UnUseList = new List<GameObject>();
public GameObject Out() {
if (UnUseList.Count > 0) {
GameObject go = UnUseList[0];
UnUseList.RemoveAt(0);
go.SetActive(true);
return go;
}
GameObject newGo = GameObject.Instantiate(prefab);
return newGo;
}
public void In(GameObject obj) {
if (UnUseList.Count >= maxNum) {
GameObject.Destroy(obj);
return;
}
obj.SetActive(false);
UnUseList.Add(obj);
}
}二、对象池列表
using System.Collections.Generic;
using UnityEngine;
//可编辑的列表,可视化新加对象池
public class GameObjectPoolList : ScriptableObject {
public List<GameObjectPool> pools = new List<GameObjectPool>();
}三、对象池管理器
using System.Collections.Generic;
using UnityEngine;
public class PoolManager {
private static PoolManager _instance;
public static PoolManager Instance {
get {
if (_instance == null)
_instance = new PoolManager();
return _instance;
}
}
private Dictionary<string, GameObjectPool> pools;
public PoolManager() {
//加载序列化添加的对象池,添加到字典中
GameObjectPoolList gameObjectPoolList = Resources.Load<GameObjectPoolList>("gameobjectpool");
pools = new Dictionary<string, GameObjectPool>();
foreach (GameObjectPool pool in gameObjectPoolList.pools) {
pools.Add(pool.name, pool);
}
}
public object Out(string Name) {
GameObjectPool pool;
pools.TryGetValue(Name, out pool);
if (pool != null) {
return pool.Out();
}
return null;
}
public void In(string Name,GameObject obj) {
GameObjectPool pool;
pools.TryGetValue(Name, out pool);
if (pool != null)
{
pool.In(obj);
return;
}
Debug.LogWarning("PoolName:" + Name + "不存在!");
}
}生成序列化类的变量的文件(点这里)。对象池的名字可以用配置的形式规定,例如用枚举来做名字等,方便修改等。