You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/D2D_Scripts/Gameplay/Pool/Pool.cs

96 lines
2.5 KiB
C#

2 months ago
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using D2D.Utilities;
using D2D;
using D2D.Gameplay;
using DG.Tweening;
using NaughtyAttributes;
using static D2D.Utilities.SettingsFacade;
using static D2D.Utilities.CommonLazyFacade;
using static D2D.Utilities.CommonGameplayFacade;
namespace D2D
{
public class Pool : SmartScript
{
[Tooltip("Leave it empty if it is not manual setup pool, like for UI")]
[SerializeField] private PoolType _poolType;
public PoolType Type => _poolType;
private Queue<PoolMember> _instances = new Queue<PoolMember>();
// private bool _isInited;
/*private Dictionary<PoolMemberType, Queue<PoolMember>> _poolMemberInstances =
new Dictionary<PoolMemberType, Queue<PoolMember>>;*/
/*private void Awake()
{
Init();
}*/
public void Init(PoolType t = null)
{
/*if (_isInited)
return;*/
// _isInited = true;
if (t != null)
_poolType = t;
FillPoolWithEmpties();
}
private void FillPoolWithEmpties()
{
for (var i = 0; i < _poolType.size; i++)
{
SpawnPoolMember();
}
}
private void SpawnPoolMember()
{
var newEffect = Instantiate(_poolType.prefab, transform.position, Quaternion.identity, transform);
newEffect.gameObject.Off();
_instances.Enqueue(newEffect);
}
private void Update()
{
var activeCount = _instances.Count(c => !c.gameObject.activeSelf);
var allCount = _poolType.size;
ConsoleProDebug.Watch("Pool objects affected", activeCount + " / " + allCount);
}
public GameObject Spawn(Vector3 position)
{
if (_instances.Count == 0)
{
SpawnPoolMember();
}
var effect = _instances.Dequeue();
_instances.Enqueue(effect);
effect.DOKill();
effect.transform.position = position;
effect.gameObject.On();
effect.HideAfter(this, _poolType.lifetime);
return effect.gameObject;
}
public void HideEffect(PoolMember effectToHide)
{
effectToHide.gameObject.Off();
}
}
}