using System; using System.Collections; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.Rendering.Universal; // ReSharper disable once CheckNamespace namespace BlueWaterProject { [Serializable] public class ActiveSkill : MonoBehaviour { #region Properties and variables [field: SerializeField] public ActiveSkillData ActiveSkillData { get; set; } // Data [Title("Indicator Data")] [SerializeField] protected DecalProjector indicator; [field: DisableIf("@true")] [field: SerializeField] public bool IsCasting { get; set; } [DisableIf("@true")] [SerializeField] protected bool followMouse; protected Camera mainCam; protected Collider user; protected Collider[] hitColliders; protected float endSkillTime; // Hash protected static readonly int FillHash = Shader.PropertyToID("_Fill"); #endregion #region Unity built-in methods protected virtual void Awake() { InitComponent(); HideIndicator(); BasicSetting(); } private void Update() { if (followMouse) { FollowMouse(); } } #endregion #region Custorm methods private void InitComponent() { indicator = GetComponentInChildren(); mainCam = Camera.main; } protected void BasicSetting() { if (indicator) { indicator.scaleMode = DecalScaleMode.InheritFromHierarchy; indicator.material = new Material(indicator.material); indicator.material.SetFloat(FillHash, 0f); } hitColliders = new Collider[ActiveSkillData.MaxAttackTargets]; } protected void HideIndicator() { if (indicator) { indicator.enabled = false; indicator.material.SetFloat(FillHash, 0); } IsCasting = false; followMouse = false; } public IEnumerator ShowIndicator() { if (indicator) { indicator.transform.position = user.transform.position; indicator.material.SetFloat(FillHash, 0); indicator.enabled = true; while (true) { indicator!.transform.position = user.transform.position; yield return null; } } else { yield break; } } private void InterruptIndicator() { HideIndicator(); } public virtual void Execute(LayerMask targetLayer, Vector3 targetPos, Action action1 = null, Action action2 = null, Action action3 = null) { Debug.LogError("Base Skill Execute"); } public virtual void Execute(LayerMask targetLayer, Vector3 targetPos, float[] bossMapVertices) { Debug.LogError("Base Skill Execute"); } public virtual void Execute(Collider target) { Debug.LogError("Base Skill Execute"); } protected void CastingMove() { switch (ActiveSkillData.CastingType) { case 0: break; case 1: break; case 2: transform.position = user.transform.position; break; } } protected void FollowMouse() { var ray = mainCam.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out var raycastHit, 2000)) { var userPos = user.transform.position; var targetPos = (userPos + raycastHit.point) / 2; var distance = targetPos - userPos; distance = Vector3.ClampMagnitude((distance * 2), ActiveSkillData.Range); if (indicator) { indicator.transform.position = userPos + distance; } } } public void SetUser(Collider value) => user = value; public float GetEndSkillTime() => endSkillTime; #endregion } }