Files
BABA_YAGA/Assets/Scripts/Player/vEffect/Scripts/vEffectSender.cs
2026-06-04 10:42:23 +07:00

69 lines
2.6 KiB
C#

using UnityEngine;
namespace Invector
{
[vClassHeader("Effect Sender", "Use this component with the vEffectReceiver added on your Player Root to trigger Effects", openClose = false)]
public class vEffectSender : vMonoBehaviour
{
[vHelpBox("Make sure you check where the vEffectReceiver is on your player, root object, parented or inside as children. By default is located inside the Invector Components > vEffects")]
public vEffectStruct[] effects;
[System.Serializable]
public class vEffectStruct : vIEffect
{
public enum GetReceiverMethod
{
InTarget, InParent, InChildren
}
public GetReceiverMethod getReceiverMethod = GetReceiverMethod.InChildren;
[SerializeField] protected string effectName;
[SerializeField] protected float effectDuration;
public string EffectName => effectName;
public float EffectDuration => effectDuration;
public Vector3 EffectPosition { get; set; }
public Transform Sender { get; set; }
}
public Transform overrideEffectSender;
public virtual void SetOverrideEffectSender(Transform t)
{
overrideEffectSender = t;
}
public void Send(GameObject target)
{
Send(target.transform);
}
public void Send(Transform target)
{
for (int i = 0; i < effects.Length; i++)
{
var effect = effects[i];
effect.Sender = overrideEffectSender ? overrideEffectSender : transform;
effect.EffectPosition = transform.position;
vEffectReceiver receiver = null;
switch (effect.getReceiverMethod)
{
case vEffectStruct.GetReceiverMethod.InTarget:
if (target.TryGetComponent(out receiver)) receiver.OnReceiveEffect(effect);
break;
case vEffectStruct.GetReceiverMethod.InParent:
receiver = target.GetComponentInParent<vEffectReceiver>();
if (receiver) receiver.OnReceiveEffect(effect);
break;
case vEffectStruct.GetReceiverMethod.InChildren:
receiver = target.GetComponentInChildren<vEffectReceiver>();
if (receiver) receiver.OnReceiveEffect(effect);
break;
}
}
}
public void Send(Collider target)
{
Send(target.transform);
}
}
}