CapersProject/Assets/02.Scripts/Skill/BaseSkill.cs
Nam Tae Gun 0cdf1aa3a8 전투플레이어 로직 전체 수정
+ 이벤트 구독 방식에서 인터페이스 형식으로 변경
2024-06-17 06:29:06 +09:00

117 lines
3.1 KiB
C#

using System;
using BlueWater.Utility;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Rendering.Universal;
namespace BlueWater
{
public abstract class BaseSkill : MonoBehaviour
{
// Variables
#region Variables
// Components
protected GameObject SkillUser;
// 스킬 데이터
[Title("스킬 데이터")]
[SerializeField]
protected SkillData SkillData;
[SerializeField, DisableIf("@true")]
protected bool EnableSkill = true;
// 스킬 표시기 옵션
[Title("스킬 표시기 옵션")]
[SerializeField]
protected bool IsUsingIndicator = true;
[SerializeField]
protected DecalProjector Indicator;
// Variables
protected Coroutine CooldownCoroutineInstance;
protected Coroutine SkillCoroutineInstance;
protected Collider[] HitColliders;
protected RaycastHit[] RaycastHits;
protected bool IsUsingSkill;
// Hashes
protected static readonly int _fillHash = Shader.PropertyToID("_Fill");
#endregion
// Unity Events
#region Unity Events
private void Start()
{
InitializeData();
}
#endregion
// Initialize Methods
#region Initialize Methods
public void Initialize(GameObject skillUser)
{
SkillUser = skillUser;
}
protected virtual void InitializeData()
{
BasicSetting();
HideIndicator();
}
#endregion
// Methods
#region Methods
protected virtual void BasicSetting()
{
if (IsUsingIndicator && Indicator)
{
Indicator.scaleMode = DecalScaleMode.InheritFromHierarchy;
Indicator.material = new Material(Indicator.material);
Indicator.material.SetFloat(_fillHash, 0f);
}
}
protected virtual void HideIndicator()
{
if (IsUsingIndicator && Indicator)
{
Indicator.enabled = false;
Indicator.material.SetFloat(_fillHash, 0);
}
}
protected virtual void ShowIndicator()
{
if (IsUsingIndicator && Indicator)
{
Indicator.material.SetFloat(_fillHash, 0);
Indicator.enabled = true;
}
}
public virtual bool CanSkill() => EnableSkill;
/// <param name="actions">0번째 actions은 스킬이 종료된 후 실행해야하는 것들</param>
public abstract void ActivateSkill(params Action[] actions);
protected void EndCooldown()
{
Utils.EndUniqueCoroutine(this, ref CooldownCoroutineInstance);
EnableSkill = true;
}
public string SkillName => SkillData.Name;
public float Cooldown => SkillData.Cooldown;
#endregion
}
}