CapersProject/Assets/02.Scripts/BlueWater/Character/Enemy/Boss/BossSkillController.cs
2025-02-03 19:03:41 +09:00

115 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;
namespace BlueWater.Enemies.Bosses
{
public class BossSkillController : MonoBehaviour
{
// Variables
#region Variables
// Components
[SerializeField]
private List<BaseSkill> _skillList;
private Dictionary<string, BaseSkill> _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<BaseSkill> skillList)
{
_skillList = skillList;
_instantiateSkillDictionary = new Dictionary<string, BaseSkill>(_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
/// <summary>
/// 사용하기 전에 CanSkill() 함수를 통해서 사용이 가능한 스킬인지 먼저 체크해야 합니다.
/// </summary>
/// <param name="skillName"></param>
[Button("스킬 사용")]
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
}
}