Files
Genesis_Unity/Assets/02_Scripts/_Shared/Status/DebuffInstance.cs

56 lines
1.4 KiB
C#

using UnityEngine;
public class DebuffInstance
{
public DebuffData Data { get; private set; }
public float RemainingTime { get; private set; }
public bool IsExpired => RemainingTime <= 0f;
private StatusEffectReceiver _receiver;
private float _tickAccumulator;
private GameObject _visualInstance;
public DebuffInstance(DebuffData data, StatusEffectReceiver receiver)
{
Data = data;
_receiver = receiver;
RemainingTime = data.Duration;
_tickAccumulator = 0f;
}
public void OnApply()
{
if (Data.EffectPrefab != null)
{
_visualInstance = Object.Instantiate(Data.EffectPrefab, _receiver.transform);
}
}
public void Tick(float deltaTime)
{
RemainingTime -= deltaTime;
if (Data.DebuffType == DebuffType.DamageOverTime && Data.TickInterval > 0)
{
_tickAccumulator += deltaTime;
if (_tickAccumulator >= Data.TickInterval)
{
_tickAccumulator -= Data.TickInterval;
IDamageable damageable = _receiver.GetComponent<IDamageable>();
damageable?.TakeDamage(Mathf.RoundToInt(Data.Value), null);
}
}
}
public void OnRemove()
{
if (_visualInstance != null)
Object.Destroy(_visualInstance);
}
public void RefreshDuration()
{
RemainingTime = Data.Duration;
}
}