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 } }