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

ObjectPool<T0> Constructor

Declaration

public ObjectPool<T0>(Func<T> createFunc, Action<T> actionOnGet, Action<T> actionOnRelease, Action<T> actionOnDestroy, bool collectionCheck, int defaultCapacity, int maxSize);

Параметры

Параметр Описание
createFunc Метод, вызываемый для создания нового экземпляра, когда пул пуст. В большинстве случаев это простой метод, который просто возвращает только что созданный экземпляр типа pooled.
actionOnGet Метод, вызванный при взятии экземпляра из пула. Используйте этот метод для настройки и активации экземпляра.
actionOnRelease Метод, вызываемый при возвращении экземпляра в пул. Используйте его для очистки и деактивации экземпляра.
actionOnDestroy Метод, вызываемый, когда экземпляр не может быть возвращен в пул из-за того, что пул достиг максимального размера.
collectionCheck Если установлено значение true, проверки коллекции выполняются при возвращении экземпляра в пул и возникает исключение, если экземпляр уже в пуле. Проверки коллекции выполняются только в Редакторе, а не в сборках Проигрывателя. Если установлено значение false, проверки коллекции не выполняются.
defaultCapacity Ёмкость пула по умолчанию при создании, выраженная числом экземпляров объектов. Это начальная ёмкость стековой структуры, которую пул использует для внутреннего хранения. Учтите: это не значит, что при создании сразу формируется такое количество экземпляров, — они создаются по одному при каждом вызове Get, в котором содержится ссылка на createFuncКогда бассейн достигает defaultCapacity, он расширяется для включения любых дополнительных возвращенных ему экземпляров, но только в пределах, определенных maxSize.
maxSize Максимальное количество экземпляров объектов, которое может содержать пул. Пул может расширяться от начального defaultCapacity до maxSize и не далее. Когда пул достигает maxSize, то любые последующие экземпляры, возвращенные в пул, игнорируются и могут быть собраны как мусор. Используйте это, чтобы предотвратить рост пула за пределы предопределенного предела.

Описание

Создает новый экземпляр ObjectPool.

using System.Text;
using UnityEngine;
using UnityEngine.Pool;

// This component returns the particle system to the pool when the OnParticleSystemStopped event is received. [RequireComponent(typeof(ParticleSystem))] public class ReturnToPool : MonoBehaviour { public ParticleSystem system; public IObjectPool<ParticleSystem> pool;

void Start() { system = GetComponent<ParticleSystem>(); ParticleSystem.MainModule main = system.main; main.stopAction = ParticleSystemStopAction.Callback; }

void OnParticleSystemStopped() { // Return to the pool pool.Release(system); } }

// This example spans a random number of ParticleSystems using a pool so that old systems can be reused. public class PoolExample : MonoBehaviour { public enum PoolType { Stack, LinkedList }

public PoolType poolType;

// Collection checks will throw errors if we try to release an item that is already in the pool. public bool collectionChecks = true; public int maxPoolSize = 10;

IObjectPool<ParticleSystem> m_Pool;

public IObjectPool<ParticleSystem> Pool { get { if (m_Pool == null) { if (poolType == PoolType.Stack) m_Pool = new ObjectPool<ParticleSystem>(CreatePooledItem, OnTakeFromPool, OnReturnedToPool, OnDestroyPoolObject, collectionChecks, 10, maxPoolSize); else m_Pool = new LinkedPool<ParticleSystem>(CreatePooledItem, OnTakeFromPool, OnReturnedToPool, OnDestroyPoolObject, collectionChecks, maxPoolSize); } return m_Pool; } }

ParticleSystem CreatePooledItem() { GameObject gameObject = new GameObject("Pooled Particle System"); ParticleSystem particleSystem = gameObject.AddComponent<ParticleSystem>(); particleSystem.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear);

ParticleSystem.MainModule main = particleSystem.main; main.duration = 1; main.startLifetime = 1; main.loop = false;

// This is used to return ParticleSystems to the pool when they have stopped. ReturnToPool returnToPool = gameObject.AddComponent<ReturnToPool>(); returnToPool.pool = Pool;

return particleSystem; }

// Called when an item is returned to the pool using Release void OnReturnedToPool(ParticleSystem system) { system.gameObject.SetActive(false); }

// Called when an item is taken from the pool using Get void OnTakeFromPool(ParticleSystem system) { system.gameObject.SetActive(true); }

// If the pool capacity is reached then any items returned will be destroyed. // We can control what the destroy behavior does, here we destroy the GameObject. void OnDestroyPoolObject(ParticleSystem system) { Destroy(system.gameObject); }

void OnGUI() { GUILayout.Label("Pool size: " + Pool.CountInactive); if (GUILayout.Button("Create Particles")) { int amount = Random.Range(1, 10); for (int i = 0; i < amount; ++i) { ParticleSystem particleSystem = Pool.Get(); particleSystem.transform.position = Random.insideUnitSphere * 10; particleSystem.Play(); } } } }