using System.Collections; using UnityEngine; // 剣閃シェーダーを使った発展的な攻撃エフェクト public class SlashEffect : MonoBehaviour { private static readonly int MagId = Shader.PropertyToID("_Mag"); [Tooltip("剣閃エフェクトの広がり方")] [SerializeField] private AnimationCurve magnitudeCurve = AnimationCurve.Linear(0f, 0f, 1f, 1f); [Tooltip("攻撃中だけ表示する剣閃エフェクトのRenderer")] [SerializeField] private MeshRenderer slashMeshRenderer; private Material _slashMaterial; private Coroutine _playCoroutine; private void Awake() { _slashMaterial = slashMeshRenderer.material; SetMagnitude(0f); SetVisible(false); } public void Play(float duration) { if (_playCoroutine != null) StopCoroutine(_playCoroutine); _playCoroutine = StartCoroutine(PlayCoroutine(duration)); } // 再生中の剣閃を停止して初期表示へ戻す public void Stop() { if (_playCoroutine != null) StopCoroutine(_playCoroutine); _playCoroutine = null; SetVisible(false); SetMagnitude(0f); } private IEnumerator PlayCoroutine(float duration) { SetVisible(true); var elapsedTime = 0f; while (elapsedTime < duration) { var progress = elapsedTime / duration; SetMagnitude( magnitudeCurve.Evaluate(progress)); elapsedTime += Time.deltaTime; yield return null; } SetMagnitude(magnitudeCurve.Evaluate(1f)); SetVisible(false); SetMagnitude(0f); _playCoroutine = null; } private void SetMagnitude(float value) { _slashMaterial.SetFloat(MagId, value); } private void SetVisible(bool isVisible) { slashMeshRenderer.enabled = isVisible; } private void OnDisable() { Stop(); } private void OnDestroy() { Destroy(_slashMaterial); } }