用unity ObjectPool类创建对象池,开始对象池为空,当向对象池获取元素时,对象池有则返回元素,无则创建新元素放进对象池并返回,当使用结束后放回对象池并隐藏,并且有对象池的内存释放逻辑,方便转场时释放内存
时间: 2023-11-26 09:04:08 浏览: 71
好的,以下是一个简单的示例代码,演示如何使用Unity中的ObjectPool类创建对象池,并实现对象的获取、使用和释放:
```csharp
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoBehaviour
{
// 存储所有对象的列表
private List<GameObject> objectList = new List<GameObject>();
// 对象池中的模板对象
public GameObject objectPrefab;
// 对象池中对象的最大数量
public int maxObjectCount = 10;
// 对象池中对象的数量
private int objectCount = 0;
// 创建新对象并加入对象池
private GameObject CreateObject()
{
if (objectCount < maxObjectCount)
{
GameObject obj = Instantiate(objectPrefab);
obj.SetActive(false);
objectList.Add(obj);
objectCount++;
return obj;
}
else
{
Debug.LogWarning("ObjectPool is full!");
return null;
}
}
// 获取对象池中的对象
public GameObject GetObject()
{
GameObject obj = null;
for (int i = 0; i < objectCount; i++)
{
if (!objectList[i].activeSelf)
{
obj = objectList[i];
obj.SetActive(true);
break;
}
}
if (obj == null)
{
obj = CreateObject();
obj.SetActive(true);
}
return obj;
}
// 释放对象池中的对象
public void ReleaseObject(GameObject obj)
{
obj.SetActive(false);
}
// 对象池内存释放逻辑
private void OnDisable()
{
objectList.Clear();
objectCount = 0;
}
}
```
使用时,将该脚本挂在场景中的空对象上,并将需要创建的对象的Prefab赋值给`objectPrefab`变量。然后在其他脚本中,可以通过以下方式获取对象池中的对象:
```csharp
GameObject obj = objectPool.GetObject();
```
使用完对象后,将其放回对象池中:
```csharp
objectPool.ReleaseObject(obj);
```
在场景转换时,对象池脚本会被禁用,此时对象池中的所有对象会被释放,方便释放内存。
阅读全文