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; /// 0번째 actions은 스킬이 종료된 후 실행해야하는 것들 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 } }