65 lines
1.9 KiB
C#

using OctoberStudio.Easing;
using OctoberStudio.Pool;
using System.Collections.Generic;
using UnityEngine;
namespace OctoberStudio.Drop
{
public abstract class DropBehavior : MonoBehaviour
{
[SerializeField] GameObject pickUpParticle;
[SerializeField] float particleDisableDelay;
[SerializeField] string pickUpSoundName;
private int pickUpSoundHash;
private static Dictionary<DropType, PoolComponent<ParticleSystem>> particlePools = new Dictionary<DropType, PoolComponent<ParticleSystem>>();
private DropData dropData;
public DropData DropData => dropData;
public DropType DropType => dropData.DropType;
private void Awake()
{
pickUpSoundHash = pickUpSoundName.GetHashCode();
}
public virtual void Init(DropData dropData)
{
this.dropData = dropData;
if (!particlePools.ContainsKey(dropData.DropType) && pickUpParticle != null)
{
var particlePool = new PoolComponent<ParticleSystem>(pickUpParticle, 2);
particlePools[dropData.DropType] = particlePool;
}
}
public virtual void OnPickedUp()
{
if(particlePools.TryGetValue(dropData.DropType, out var particlePool))
{
var particle = particlePool.GetEntity();
particle.transform.position = transform.position;
particle.Play();
EasingManager.DoAfter(particleDisableDelay, () => { particle.gameObject.SetActive(false); });
}
GameController.AudioManager.PlaySound(pickUpSoundHash);
}
private void OnDestroy()
{
if (particlePools != null){
foreach(var pool in particlePools.Values)
{
pool.Destroy();
}
particlePools.Clear();
}
}
}
}