CapersProject/Assets/02.Scripts/BlueWater/Skill/BaseSkill.cs
2025-02-10 11:13:46 +09:00

117 lines
3.1 KiB
C#

using System;
using DDD.Utility;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Rendering.Universal;
namespace DDD
{
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
}
}