using System; using System.Collections.Generic; using UnityEngine; namespace BlueWater.Enemies.Bosses { public class BossSkillController : MonoBehaviour { // Variables #region Variables // Components [SerializeField] private List _skillList; private Dictionary _instantiateSkillDictionary; // Variables public bool IsSkillActive { get; private set; } // Events public event Action OnStartSkill; public event Action OnEndSkill; #endregion // Unity methods #region Unity methods private void OnDestroy() { if (_instantiateSkillDictionary == null) return; foreach (var element in _instantiateSkillDictionary.Values) { if (element && element.gameObject) { Destroy(element.gameObject); } } } #endregion // Initialize methods #region Initialize methods public void Initialize(List skillList) { _skillList = skillList; _instantiateSkillDictionary = new Dictionary(_skillList.Count); for (var i = 0; i < _skillList.Count; i++) { var instantiateSkill = Instantiate(_skillList[i]); instantiateSkill.Initialize(gameObject); _instantiateSkillDictionary.Add(instantiateSkill.SkillName, instantiateSkill); } } #endregion // Methods #region Methods // Events methods /// /// 사용하기 전에 CanSkill() 함수를 통해서 사용이 가능한 스킬인지 먼저 체크해야 합니다. /// /// public void ActivateSkill(string skillName) { if (!_instantiateSkillDictionary.TryGetValue(skillName, out var skill)) { Debug.Log($"{skillName}(이)라는 스킬을 찾을 수 없습니다."); return; } OnStartSkill?.Invoke(); IsSkillActive = true; skill.ActivateSkill(EndSkill); } // Methods public bool CanSkill(string skillName) { if (!_instantiateSkillDictionary.TryGetValue(skillName, out var skill)) { Debug.Log($"{skillName}(이)라는 스킬을 찾을 수 없습니다."); return false; } if (IsSkillActive) return false; return skill.CanSkill(); } private void EndSkill() { OnEndSkill?.Invoke(); IsSkillActive = false; } public void StopAllCoroutine() { foreach (var element in _instantiateSkillDictionary.Values) { element.StopAllCoroutines(); } } #endregion } }