极简对象池

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); // 释放对象

通过这种方式,你可以有效地管理对象的创建和销毁,减少频繁实例化和销毁对象带来的性能开销,提高游戏或应用的性能。

作者信息

精简

精简

共发布了 1 篇文章