极简对象池
2020年02月28日 16:31
0 点赞
1 评论
更新于 2020-02-29 00:37
源码
以下是一个简单的对象池实现的代码示例:
public class PoolObj
{
// 存储池化对象的列表
private List<GameObject> pooledObjects = null;
// 资源路径
private string path = string.Empty;
// 构造函数,初始化对象池并指定资源路径
public PoolObj(string path)
{
pooledObjects = new List<GameObject>();
this.path = path;
}
// 从对象池中获取一个可用的对象
public GameObject GetObj()
{
// 遍历对象池中的所有对象
for (int i = 0; i < pooledObjects.Count; i++)
{
GameObject tempObj = pooledObjects[i];
// 检查对象是否处于非激活状态
if (!tempObj.activeInHierarchy)
{
// 如果非激活,则激活该对象并返回
tempObj.SetActive(true);
return tempObj;
}
}
// 如果对象池中没有可用对象,且资源路径不为空
if (!string.IsNullOrEmpty(path))
{
// 从指定路径加载资源并实例化新对象
GameObject newObj = MonoBehaviour.Instantiate(Resources.Load<GameObject>(path));
// 新对象初始状态设为非激活
newObj.SetActive(false);
// 将新对象添加到对象池中
pooledObjects.Add(newObj);
// 递归调用 GetObj 方法以获取可用对象
return GetObj();
}
// 如果资源路径为空,输出错误信息
Debug.LogError("PoolObj Resources path == null ");
return null;
}
}
使用方法
初始化对象池
PoolObj poolObj = new PoolObj("Cube");
这里的 "Cube"
是 Resources.Load
加载资源的地址。Resources.Load
是 Unity 中用于从 Resources
文件夹加载资源的方法,确保你的资源文件存放在项目的 Assets/Resources
文件夹下。
获取对象实例
poolObj.GetObj();
调用 GetObj
方法可以从对象池中获取一个可用的对象实例。如果对象池中存在未被使用(即处于非激活状态)的对象,该方法会激活并返回该对象;如果对象池中没有可用对象,它会根据指定的资源路径加载并实例化一个新对象,将其添加到对象池中,然后返回该新对象。这个方法可以重复调用,它会自动管理资源的添加和利用。
释放对象
对于不再使用的对象,只需将其隐藏(设为非激活状态)即可,后续调用 GetObj
方法时,这些非激活对象会被重新利用。例如:
GameObject obj = poolObj.GetObj();
// 使用对象...
obj.SetActive(false); // 释放对象
通过这种方式,你可以有效地管理对象的创建和销毁,减少频繁实例化和销毁对象带来的性能开销,提高游戏或应用的性能。