Files
VOIDRPG/Assets/90 - Scripts/Generic/Status/Effect/Visual/ApplyVFXEffect.cs
T
2026-07-09 21:33:33 +02:00

70 lines
2.3 KiB
C#

using System;
using System.Linq;
using Sirenix.OdinInspector;
using UnityEngine;
using Object = UnityEngine.Object;
namespace VOID.Generic.Status.Effect.Visual
{
[TypeRegistryItem("Apply VFX")]
public class ApplyVFXEffect : BasicEffect
{
[InfoBox(
"<b>" + nameof(Never) + "</b> - never will be destroyed, by this effect\n" +
"<b>" + nameof(OnParticleSystemEnd) + "</b> - will be destroyed after longest duration of " + nameof(ParticleSystem) + "\n" +
"<b>" + nameof(OnFixedTime) + "</b> - will be destroyed after given time in seconds"
)]
private enum DestroyMoment
{
Never,
OnParticleSystemEnd,
OnFixedTime
}
[SerializeField, Required] private GameObject _vfxPrefab;
[SerializeField] private DestroyMoment _destroyMoment;
[SerializeField, ShowIf(nameof(_destroyMoment), DestroyMoment.OnFixedTime)] private float _secondsUntilDestroy;
private GameObject _vfxGameObject;
public override void OnApply()
{
_vfxGameObject = Object.Instantiate(_vfxPrefab, forObject.transform, false);
switch (_destroyMoment)
{
case DestroyMoment.Never:
break;
case DestroyMoment.OnParticleSystemEnd:
DestroyOnDurationEnd();
break;
case DestroyMoment.OnFixedTime:
DestroyOnFixedTime();
break;
default:
throw new ArgumentOutOfRangeException();
}
}
private void DestroyOnDurationEnd()
{
var duration = _vfxGameObject
.GetComponentsInChildren<ParticleSystem>()
.Select(ps => ps.main.duration)
.Max();
Object.Destroy(_vfxGameObject, duration);
}
private void DestroyOnFixedTime()
{
Object.Destroy(_vfxGameObject, _secondsUntilDestroy);
}
public override void OnEnd() {}
public override void OnTurnSelfEnd() {}
public override void OnTurnSelfStart() {}
public override void OnCancel() => OnEnd();
public override string GetSimpleDescription() => $"add visual effects: {_vfxPrefab.name}";
}
}