unity泛型对象池格式
时间: 2025-07-09 08:45:14 浏览: 4
### Unity 泛型对象池的实现格式与示例代码
在 Unity 中,泛型对象池是一种常见的优化技术,用于减少频繁实例化和销毁对象带来的性能开销。通过使用 C# 的泛型功能,可以创建一个通用的对象池类,适用于多种类型的对象[^2]。
以下是实现泛型对象池的完整示例代码:
```csharp
using System.Collections.Generic;
using UnityEngine;
public class GenericObjectPool<T> where T : Component, new()
{
private Queue<T> _objectQueue; // 用于存储已实例化的对象
public GenericObjectPool(int initialSize)
{
_objectQueue = new Queue<T>(initialSize);
PreallocateObjects(initialSize); // 预先分配对象
}
/// <summary>
/// 获取一个对象实例。如果池中没有可用对象,则创建新对象。
/// </summary>
public T GetObject()
{
if (_objectQueue.Count > 0)
{
T obj = _objectQueue.Dequeue();
obj.gameObject.SetActive(true); // 激活对象
return obj;
}
else
{
return CreateNewObject(); // 如果池中无对象,则创建新对象
}
}
/// <summary>
/// 将对象归还到池中。
/// </summary>
public void ReturnObject(T obj)
{
obj.gameObject.SetActive(false); // 禁用对象
_objectQueue.Enqueue(obj); // 将对象放回队列
}
/// <summary>
/// 预先分配指定数量的对象。
/// </summary>
private void PreallocateObjects(int count)
{
for (int i = 0; i < count; i++)
{
T obj = CreateNewObject();
obj.gameObject.SetActive(false); // 初始状态为禁用
_objectQueue.Enqueue(obj);
}
}
/// <summary>
/// 创建一个新的对象实例。
/// </summary>
private T CreateNewObject()
{
GameObject prefab = Resources.Load<GameObject>("Prefabs/" + typeof(T).Name);
if (prefab == null)
{
throw new System.Exception($"无法加载预制体: {typeof(T).Name}");
}
GameObject instance = Instantiate(prefab);
return instance.GetComponent<T>();
}
}
```
#### 示例说明
1. **泛型约束**:`where T : Component, new()` 表示类型 `T` 必须继承自 `Component` 并且具有无参构造函数[^2]。
2. **对象获取与归还**:通过 `GetObject` 方法从池中获取对象,通过 `ReturnObject` 方法将对象归还到池中。
3. **预分配对象**:在初始化时调用 `PreallocateObjects` 方法预先创建一定数量的对象,避免运行时频繁实例化。
4. **资源加载**:`CreateNewObject` 方法通过 `Resources.Load` 加载预制体并实例化对象。
### 注意事项
- 确保预制体路径正确,并且预制体名称与类型 `T` 的名称一致。
- 如果需要支持非组件类型(如普通类),可以移除 `Component` 约束,但需要调整对象激活/禁用逻辑[^4]。
---
###
阅读全文
相关推荐


















