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