OldBlueWater/BlueWater/Assets/02.Scripts/NewSkill/SkillBase.cs
NTG f1d0c6d371 Closes #244, #254 CombatPlayer 개선, 하트 시스템 추가
+ CombatPlayer 기능별 분리
+ Combat, CombatUi 전용 input action map 추가
+ 스킬 시스템 로직 수정
+ 전투플레이어 스킬(검의 왈츠) 로직 변경
2024-05-08 00:37:33 +09:00

163 lines
5.9 KiB
C#

using System;
using System.Collections;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Rendering.Universal;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
// [Serializable]
// public class SkillInputData
// {
// [field: Title("초기화 데이터")]
// [field: SerializeField] public Collider PlayerCollider { get; set; }
// [field: SerializeField] public Rigidbody PlayerRb { get; set; }
// [field: SerializeField] public NavMeshAgent PlayerAgent { get; set; }
// [field: SerializeField] public Transform PlayerVisualLook { get; set; }
// [field: SerializeField] public Animator PlayerAnimator { get; set; }
// [field: SerializeField] public Collider TargetCollider { get; set; }
// [field: SerializeField] public LayerMask TargetLayer { get; set; }
// [field: SerializeField] public SkillUi SkillUi { get; set; }
//
// public Vector3 StartPosition { get; set; }
// public Vector3 PreviousDirection { get; set; }
//
// public void InitInputData(Collider collider, Rigidbody rb, NavMeshAgent playerAgent, Transform visualLook, Animator animator, Collider target, LayerMask layer, SkillUi ui)
// {
// PlayerCollider = collider;
// PlayerRb = rb;
// PlayerAgent = playerAgent;
// PlayerVisualLook = visualLook;
// PlayerAnimator = animator;
// TargetCollider = target;
// TargetLayer = layer;
// SkillUi = ui;
// }
// }
public abstract class SkillBase : MonoBehaviour, ISkill
{
/***********************************************************************
* Variables
***********************************************************************/
#region Variables
[field: Title("기본 설정")]
[field: SerializeField] public string SkillName { get; set; }
[field: DisableIf("@true")]
[field: SerializeField] public bool ReadySkill { get; set; } = true;
[field: SerializeField] public float Damage { get; set; }
[field: SerializeField] public float Cooldown { get; set; }
[field: SerializeField] public float Range { get; set; }
[field: SerializeField] public float CastingTime { get; set; }
[field: SerializeField] public float SkillDuration { get; set; }
[Title("스킬 표시기 옵션")]
[SerializeField] protected bool isUsingIndicator = true;
[SerializeField] protected DecalProjector indicator;
[field: DisableIf("@true")]
[field: SerializeField] public SkillInputData SkillInputData { get; set; }
protected Transform instantiateLocation;
protected static readonly int FillHash = Shader.PropertyToID("_Fill");
#endregion
/***********************************************************************
* Unity Events
***********************************************************************/
#region Unity Events
private void Start()
{
var instantiateObjects = GameObject.Find("InstantiateObjects").transform;
if (!instantiateObjects)
{
instantiateObjects = new GameObject("InstantiateObjects").transform;
}
instantiateLocation = instantiateObjects.Find("Particles");
if (!instantiateLocation)
{
instantiateLocation = new GameObject("Particles").transform;
instantiateLocation.SetParent(instantiateObjects);
}
}
#endregion
/***********************************************************************
* Interfaces
***********************************************************************/
#region Interfaces
public abstract void ActivateSkill(params Action[] actions);
public virtual bool EnableSkill() => ReadySkill;
public virtual void InitData()
{
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 void CoolDown(float waitTime, Action onCooldownComplete = null)
{
StartCoroutine(CoolDownCoroutine(waitTime, onCooldownComplete));
}
private IEnumerator CoolDownCoroutine(float waitTime, Action onCooldownComplete = null)
{
var time = 0f;
while (time <= waitTime)
{
time += Time.deltaTime;
yield return null;
}
onCooldownComplete?.Invoke();
}
#endregion
}
}