OldBlueWater/BlueWater/Assets/02.Scripts/NewSkill/SkillBase.cs

95 lines
2.7 KiB
C#
Raw Normal View History

using System;
using System.Collections;
using Sirenix.OdinInspector;
using UnityEngine;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
[Serializable]
public class SkillInputData
{
[Title("초기화 데이터")]
public Collider playerCollider;
public Rigidbody playerRb;
public Transform playerVisualLook;
public LayerMask targetLayer;
public SkillUi skillUi;
[Title("실시간 데이터")]
public Vector3 startPosition;
public void InitInputData(Collider collider, Rigidbody rb, Transform visualLook, LayerMask target, SkillUi ui)
{
playerCollider = collider;
playerRb = rb;
playerVisualLook = visualLook;
targetLayer = target;
skillUi = ui;
}
public void UpdateInputData(Vector3 start)
{
startPosition = start;
}
}
public abstract class SkillBase : MonoBehaviour, ISkill
{
[Title("기본 설정")]
public string skillName;
public bool enableSkill = true;
public float damage;
public float cooldown;
public float range;
public float castingTime;
public float skillDuration;
[field: DisableIf("@true")]
[field: SerializeField] public SkillInputData SkillInputData { get; set; }
protected Transform instantiateLocation;
public abstract void ActivateSkill();
public virtual bool EnableSkill() => enableSkill;
public virtual void InitData()
{
}
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);
}
}
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();
}
}
}