Стековый пул экземпляров объектов типа T, реализующий интерфейс IObjectPool.
С помощью этого класса создаётся пул экземпляров объектов, которые можно переиспользовать, чтобы снизить издержки частого создания и уничтожения объектов.
Конструктор принимает делегаты в качестве аргументов, позволяющих определить поведение пула при создании элемента, его извлечении из пула, возвращении в пул или уничтожении. Также можно указать емкость пула по умолчанию, максимальный размер, до которого может расти пул, и выполнять ли проверку сбора при возвращении элемента в пул для выявления ошибок двойного выпуска.
Использование ObjectPool<T0>.Get Если пул пуст, то новый экземпляр создается с помощью метода, переданного в качестве createFunc параметр конструктора. Используйте ObjectPool<T0>.Release Если пул достиг максимального размера, то экземпляр уничтожается с помощью метода, переданного в качестве параметра в команде actionOnDestroy параметр конструктора.
Важно: ObjectPool<T> хранит свои пулированные экземпляры объектов в стеке, похожем на коллекцию, поэтому не предполагает физической непрерывности объектов в памяти. ObjectPool<T> небезопасен для вызова из фоновых потоков.
Дополнительные сведения о концепции и применении пулирования объектов см. в Объединение и повторное использование объектов в руководстве.
Дополнительные ресурсы: IObjectPool<T0>
using UnityEngine;
using UnityEngine.Pool;
public class SimplePoolExample : MonoBehaviour
{
// The pool holds plain GameObjects (you can swap this for any component type).
private ObjectPool<GameObject> pool;
void Awake()
{
// Create a pool with the four core callbacks.
pool = new ObjectPool<GameObject>(
createFunc: CreateItem,
actionOnGet: OnGet,
actionOnRelease: OnRelease,
actionOnDestroy: OnDestroyItem,
collectionCheck: true, // helps catch double-release mistakes
defaultCapacity: 10,
maxSize: 50
);
}
void Update()
{
// Press Space to spawn one pooled object for 1 second.
if (Input.GetKeyDown(KeyCode.Space))
{
GameObject pooledObject = pool.Get();
pooledObject.transform.position = Random.insideUnitSphere * 5f;
// Return it to the pool after a short delay.
StartCoroutine(ReturnAfter(pooledObject, 1f));
}
}
// Creates a new pooled GameObject the first time (and whenever the pool needs more).
private GameObject CreateItem()
{
GameObject pooledObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
pooledObject.name = "PooledCube";
pooledObject.SetActive(false);
return pooledObject;
}
// Called when an item is taken from the pool.
private void OnGet(GameObject pooledObject)
{
pooledObject.SetActive(true);
}
// Called when an item is returned to the pool.
private void OnRelease(GameObject pooledObject)
{
pooledObject.SetActive(false);
}
// Called when the pool decides to destroy an item (e.g., above max size).
private void OnDestroyItem(GameObject pooledObject)
{
Destroy(pooledObject);
}
private System.Collections.IEnumerator ReturnAfter(GameObject pooledObject, float seconds)
{
yield return new WaitForSeconds(seconds);
// Give it back to the pool.
pool.Release(pooledObject);
}
}