+ CombatPlayer 기능별 분리 + Combat, CombatUi 전용 input action map 추가 + 스킬 시스템 로직 수정 + 전투플레이어 스킬(검의 왈츠) 로직 변경
163 lines
5.9 KiB
C#
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
|
|
}
|
|
} |