Unity 6.3
0 онлайн 21 гостей 3 в системе
Вход

ObjectPool<T0>

класс в UnityEngine.Pool

Выполнено в:UnityEngine.CoreModule


Интерфейсы приспособлений:IObjectPool<T0>

Описание

Стековый пул экземпляров объектов типа 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); } }

Свойства

Свойство Описание
CountActiveЧисло объектов, которые были созданы пулом, но в настоящее время используются и еще не были возвращены.
CountAllОбщее число активных и неактивных объектов.
CountInactiveЧисло объектов, которые в настоящее время доступны в пуле.

Конструкторы

Конструктор Описание
ObjectPool_1Создает новый экземпляр ObjectPool.

Открытые методы

Метод Описание
ClearУдаляет все элементы пулов и вызывает действие пулов при уничтожении обратного вызова для каждого элемента в пуле.
DisposeУдаляет все элементы пулов и вызывает действие пулов при уничтожении обратного вызова для каждого элемента в пуле.
GetПолучить экземпляр из пула. Если пул пуст, то создается новый экземпляр.
ReleaseВозвращает экземпляр обратно в пул. Если пул достиг максимального размера, возвращенный экземпляр уничтожается.