115 lines
3.1 KiB
C#
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
|
|
}
|
|
} |