Упрощенный код ObjectPooler, вопрос в том что лучше использовать для хранения объектов, List или Queue или что-то другое, какая разница в производительности ? Реализация функций GetObject в зависимости от структуры данных которые мы используем, функция RemoveActivity только для работы с очередью. При работе с листом проверяем весь лист на нахождение первого активного элемента и возвращаем его (В листе содержатся и активные и не активные элементы) изменяем активность после того как элемент отработал в коде который вызывал функцию GetObject. В очереди же содержатся только активные элементы, поэтому просто извлекаем элемент если есть доступные, но при этом когда элемент отработал его снова нужно вернуть в эту очередь.
Для тех кто не знаком с Unity, но знаком с паттерном
.activeInHierarchy - возвращает true если объект активен на сцене
GameObject базовый класс для всех объектов на сцене
public class ObjectPoolItem
{
public List<GameObject> Objects;
public ObjectPoolItem()
{
Objects = new List<GameObject>();
}
}
private Dictionary<Types, ObjectPoolItem> _pool;
public GameObject GetObjectList(Types type)
{
for(int i = 0; i < _pool[type].Objects.Count; i++)
{
if (!_pool[type].Objects[i].activeInHierarchy)
{
return _pool[type].Objects[i];
}
}
return null;
}
public GameObject GetObjectQueue(Types type)
{
if (_pool[type].Objects.Count > 0)
{
return _pool[type].Objects.Dequeue();
}
return null;
}
// Только при работе с очередью
public void RemoveActivity(GameObject obj)
{
_pool[obj.GetComponent<IPooleable>().Type].Objects.Enqueue(obj);
}