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(); } } } }