using System.Collections; using UnityEngine; // 攻撃中に剣本体を表示して振る public class AttackEffect : MonoBehaviour { [Tooltip("攻撃演出を再生する時間")] [SerializeField] private float duration = 0.2f; [Tooltip("攻撃演出を開始するときの角度")] [SerializeField] private float angleFrom = 90; [Tooltip("攻撃演出を終了するときの角度")] [SerializeField] private float angleTo = 270; [Tooltip("攻撃中だけ表示する剣本体のRenderer")] [SerializeField] private MeshRenderer swordMeshRenderer; [Tooltip("任意で再生する剣閃エフェクト")] [SerializeField] private SlashEffect slashEffect; private Coroutine _playCoroutine; public bool IsPlaying => _playCoroutine != null; private void Awake() { SetVisible(false); } public void Play() { if (_playCoroutine != null) StopCoroutine(_playCoroutine); // 連続で攻撃した場合は、演出を最初から再生し直す _playCoroutine = StartCoroutine(PlayCoroutine()); } // 再生中の剣と剣閃の演出を停止する public void Stop() { if (_playCoroutine != null) StopCoroutine(_playCoroutine); _playCoroutine = null; slashEffect?.Stop(); SetVisible(false); } private IEnumerator PlayCoroutine() { SetVisible(true); slashEffect?.Play(duration); var elapsedTime = 0f; while (true) { var progress = Mathf.Clamp01(elapsedTime / duration); transform.localRotation = Quaternion.Euler( 0f, Mathf.Lerp(angleFrom, angleTo, progress), 0f); yield return null; // ラスト1フレームを表示するため評価を遅延している if(progress >= 1f) break; elapsedTime += Time.deltaTime; } SetVisible(false); _playCoroutine = null; } private void SetVisible(bool isVisible) { swordMeshRenderer.enabled = isVisible; } private void OnDisable() { Stop(); } }