using System; using System.Collections; using BlueWaterProject; using Sirenix.OdinInspector; using UnityEngine; // ReSharper disable once CheckNamespace namespace RhinocerosSkill { public class HammerAttack : SkillBase { [Title("추가 옵션")] [SerializeField] private float hammerOffset = 3f; private Collider[] hitColliders; public override void ActivateSkill(params Action[] actions) { ReadySkill = false; SkillInputData.PlayerAnimator.SetTrigger("isHammerAttack"); CoolDown(Cooldown, () => ReadySkill = true); StartCoroutine(SkillCoroutine(actions)); } public override bool EnableSkill() { if (!ReadySkill) return false; return true; } protected override void BasicSetting() { base.BasicSetting(); hitColliders = new Collider[5]; } private IEnumerator SkillCoroutine(params Action[] actions) { while (!SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).IsName("HammerAttack")) { yield return null; } var skillPlayerPosition = SkillInputData.PlayerCollider.transform.position; var targetPosition = SkillInputData.TargetCollider.transform.position; var targetToDirection = (targetPosition - skillPlayerPosition).normalized; transform.position = skillPlayerPosition + targetToDirection * hammerOffset; transform.localScale = Vector3.one * Range; actions[1].Invoke(); 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.OverlapSphereNonAlloc(transform.position, Range, hitColliders, SkillInputData.TargetLayer); for (var i = 0; i < maxSize; i++) { var iDamageable = hitColliders[i].GetComponent(); iDamageable?.TakeDamage(Damage); } HideIndicator(); while (SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).IsName("HammerAttack") && SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f) { yield return null; } actions[0].Invoke(); } } }