using System; using System.Collections; using BlueWaterProject; using Sirenix.OdinInspector; using UnityEngine; // ReSharper disable once CheckNamespace namespace RhinocerosSkill { public class EarthquakeWave : SkillBase { [Title("추가 옵션")] [SerializeField] private bool isDrawingGizmo = true; [SerializeField] private float width = 3f; private Vector3 startPosition; private Vector3 halfScale; private RaycastHit[] hits; private bool isUsingSkill; private void OnDrawGizmos() { if (!isDrawingGizmo || !isUsingSkill) return; Gizmos.color = Color.red; var rotation = Quaternion.LookRotation(new Vector3(SkillInputData.PreviousDirection.x, 0, SkillInputData.PreviousDirection.z)); Gizmos.matrix = Matrix4x4.TRS(startPosition + SkillInputData.PreviousDirection * Range * 0.5f, rotation, Vector3.one); Gizmos.DrawWireCube(Vector3.zero, new Vector3(halfScale.x * 2, halfScale.y * 2, Range)); Gizmos.matrix = Matrix4x4.identity; } public override void ActivateSkill(params Action[] actions) { ReadySkill = false; CoolDown(Cooldown, () => ReadySkill = true); StartCoroutine(SkillCoroutine(actions)); } public override bool EnableSkill() { if (!ReadySkill) return false; return true; } protected override void BasicSetting() { base.BasicSetting(); hits = new RaycastHit[5]; } private IEnumerator SkillCoroutine(params Action[] actions) { isUsingSkill = true; startPosition = SkillInputData.PlayerRb.position; halfScale = transform.localScale * 0.5f; transform.position = startPosition; var angle = Mathf.Atan2(SkillInputData.PreviousDirection.x, SkillInputData.PreviousDirection.z) * Mathf.Rad2Deg; transform.rotation = Quaternion.Euler(0, angle, 0); transform.localScale = new Vector3(width, 6f, Range * 2); ShowIndicator(); var elapsedTime = 0f; var fill = 1 / CastingTime; while (elapsedTime < CastingTime) { elapsedTime += Time.deltaTime; if (isUsingIndicator && indicator) { var fillValue = indicator.material.GetFloat(FillHash) + Time.deltaTime * fill; indicator.material.SetFloat(FillHash, fillValue); } yield return null; } var maxSize = Physics.BoxCastNonAlloc(startPosition, halfScale, SkillInputData.PreviousDirection, hits, Quaternion.identity, 0f, SkillInputData.TargetLayer, QueryTriggerInteraction.Ignore); for (var i = 0; i < maxSize; i++) { var iDamageable = hits[i].transform.GetComponent(); iDamageable?.TakeDamage(Damage); } HideIndicator(); actions[0].Invoke(); isUsingSkill = false; } } }