58 lines
1.5 KiB
C#
58 lines
1.5 KiB
C#
using Darkmatter.Core;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using VContainer;
|
|
using VContainer.Unity;
|
|
|
|
namespace Darkmatter.Presentation
|
|
{
|
|
public class ObjectPool<T> : MonoBehaviour,IPool<T> where T : Component
|
|
{
|
|
[SerializeField] T prefab;
|
|
[SerializeField] private Transform prefabParent;
|
|
[SerializeField] private int poolSize = 15;
|
|
|
|
public Queue<T> pool = new Queue<T>();
|
|
[Inject] IObjectResolver resolver;
|
|
|
|
public IReadOnlyCollection<T> All => pool;
|
|
|
|
private void Awake()
|
|
{
|
|
CreateObjectPool();
|
|
}
|
|
|
|
private void CreateObjectPool()
|
|
{
|
|
for(int i=0;i<poolSize; i++)
|
|
{
|
|
T obj = Instantiate(prefab, prefabParent);
|
|
resolver.InjectGameObject(obj.gameObject);
|
|
obj.gameObject.SetActive(false);
|
|
pool.Enqueue(obj);
|
|
}
|
|
}
|
|
|
|
public T GetFromPool()
|
|
{
|
|
if(pool.Count == 0)
|
|
{
|
|
T obj = Instantiate(prefab, prefabParent);
|
|
resolver.InjectGameObject(obj.gameObject);
|
|
obj.gameObject.SetActive(true);
|
|
pool.Enqueue(obj);
|
|
return obj;
|
|
}
|
|
T returningObj = pool.Dequeue();
|
|
returningObj.gameObject.SetActive(true);
|
|
return returningObj;
|
|
}
|
|
|
|
public void ReturnToPool(T obj)
|
|
{
|
|
obj.gameObject.SetActive(false);
|
|
pool.Enqueue(obj);
|
|
}
|
|
}
|
|
}
|