using System; using System.Collections; using BlueWater.Audios; using BlueWater.Players; using BlueWater.Utility; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Maps { public class BossMapTrigger : MonoBehaviour { public enum BossMapTriggerAnimation { Idle, Hold, Repeat } [SerializeField] private SpineController _spineController; public Action OnInteractionActive; private Coroutine _bossMapTriggerCoroutineInstance; private void Awake() { InitializeComponents(); } private void Start() { _spineController.PlayAnimation(BossMapTriggerAnimation.Idle.ToString(), false); } private void OnTriggerEnter(Collider other) { if (!other.CompareTag("Player")) return; Utils.StartUniqueCoroutine(this, ref _bossMapTriggerCoroutineInstance, BossMapTriggerCoroutine()); } private void OnTriggerExit(Collider other) { if (!other.CompareTag("Player")) return; if (_bossMapTriggerCoroutineInstance == null) return; StopCoroutine(_bossMapTriggerCoroutineInstance); _bossMapTriggerCoroutineInstance = null; _spineController.PlayAnimation(BossMapTriggerAnimation.Idle.ToString(), false); } [Button("컴포넌트 초기화")] private void InitializeComponents() { _spineController = GetComponent(); } public void ResetTrigger() { _spineController.PlayAnimation(BossMapTriggerAnimation.Idle.ToString(), false); if (_bossMapTriggerCoroutineInstance != null) { StopCoroutine(_bossMapTriggerCoroutineInstance); _bossMapTriggerCoroutineInstance = null; } gameObject.SetActive(true); } private IEnumerator BossMapTriggerCoroutine() { AudioManager.Instance.PlaySfx("Shining"); var animationTrack = _spineController.PlayAnimation( BossMapTriggerAnimation.Hold.ToString(), false); if (animationTrack == null) { Debug.LogError("BossMapTriggerCoroutine animationTrack is null error"); yield break; } yield return new WaitUntil(() => animationTrack.IsComplete); gameObject.SetActive(false); OnInteractionActive?.Invoke(); } } }