Files
beyond/Assets/Scripts/Characters/Skills/ScanSpell.cs
2026-01-19 14:25:38 +01:00

52 lines
1.7 KiB
C#

using System.Collections;
using UnityEngine;
using UnityEngine.VFX;
namespace Beyond
{
[CreateAssetMenu(menuName = "Magic/Spells/Scan")]
public class ScanSpell : SpellDefinition
{
public GameObject effectPrefab;
public float maxRange = 50f;
public float scanDuration = 2f; // time for wave to travel
public float startDelay = 0.6f;
public override void Cast(MagicAttacks caster, Transform target)
{
caster.StartCoroutine(CastRoutine(caster));
}
private IEnumerator CastRoutine(MagicAttacks caster)
{
yield return new WaitForSeconds(startDelay);
// Instantiate visual
GameObject instance = Instantiate(effectPrefab, caster.transform.position, Quaternion.identity);
VisualEffect vfx = instance.GetComponent<VisualEffect>();
if (vfx) vfx.Play();
// Shader Logic
float speed = maxRange / scanDuration;
float timer = 0f;
while (timer < scanDuration)
{
Shader.SetGlobalFloat("_WaveTime", speed * timer);
timer += Time.deltaTime;
yield return null;
}
Shader.SetGlobalFloat("_WaveTime", 0f);
// Detection Logic
int mask = 1 << LayerMask.NameToLayer("Triggers") | 1 << LayerMask.NameToLayer("HiddenObject");
var colliders = Physics.OverlapSphere(caster.transform.position, maxRange, mask);
foreach (var c in colliders)
{
var h = c.gameObject.GetComponent<IScannable>();
if (h != null) h.OnScanned();
}
Destroy(instance);
}
}
}