using System; using System.Collections; using BlueWaterProject; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.Rendering.Universal; // ReSharper disable once CheckNamespace namespace RhinocerosSkill { public class HammerSwing : SkillBase { [Title("추가 옵션")] [SerializeField] private bool isDrawingGizmo = true; [SerializeField] private float angle = 180f; [Title("발사체 옵션")] [SerializeField] private GameObject projectilePrefab; [SerializeField] private int projectileNumber = 5; [SerializeField] private float projectileDamage = 10f; [SerializeField] private float projectileAngle = 90f; [SerializeField] private float projectileSpeed = 500f; private Collider[] hitColliders; private bool isUsingSkill; private void OnDrawGizmos() { if (!isDrawingGizmo || !isUsingSkill) return; Gizmos.color = Color.red; var skillPosition = transform.position; Gizmos.DrawWireSphere(skillPosition, Range); if (SkillInputData != null && SkillInputData.TargetCollider != null) { var skillPlayerPosition = SkillInputData.PlayerRb.position; var forward = transform.forward; var leftBoundary = Quaternion.Euler(0, -angle / 2, 0) * forward; var rightBoundary = Quaternion.Euler(0, angle / 2, 0) * forward; Gizmos.color = Color.yellow; Gizmos.DrawLine(skillPlayerPosition, skillPlayerPosition + leftBoundary * Range); Gizmos.DrawLine(skillPlayerPosition, skillPlayerPosition + rightBoundary * Range); } } public override void ActivateSkill(params Action[] actions) { ReadySkill = false; SkillInputData.PlayerAnimator.SetTrigger("isHammerSwing"); CoolDown(Cooldown, () => ReadySkill = true); StartCoroutine(SkillCoroutine(actions)); } public override bool EnableSkill() { if (!ReadySkill) return false; return true; } protected override void BasicSetting() { if (isUsingIndicator && indicator) { indicator.scaleMode = DecalScaleMode.InheritFromHierarchy; indicator.material = new Material(indicator.material); indicator.material.SetFloat(FillHash, 0f); indicator.material.SetFloat("Angle", angle); } hitColliders = new Collider[5]; } private IEnumerator SkillCoroutine(params Action[] actions) { while (!SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).IsName("HammerSwing")) { yield return null; } isUsingSkill = true; var skillPlayerPosition = SkillInputData.PlayerRb.position; var targetPosition = SkillInputData.TargetCollider.transform.position; var targetToDirection = (targetPosition - skillPlayerPosition).normalized; transform.position = skillPlayerPosition; var yAngle = Mathf.Atan2(targetToDirection.x, targetToDirection.z) * Mathf.Rad2Deg; transform.rotation = Quaternion.Euler(0, yAngle, 0); transform.localScale = Vector3.one * (Range * 2); 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 angleToTarget = Vector3.Angle(skillPlayerPosition, transform.forward); if (angleToTarget <= angle * 0.5f) { var iDamageable = hitColliders[i].GetComponent(); iDamageable?.TakeDamage(Damage); } } HideIndicator(); var startAngle = yAngle - projectileAngle * 0.5f; var angleStep = projectileAngle / (projectileNumber - 1); for (var i = 0; i < projectileNumber; i++) { var currentAngle = startAngle + angleStep * i; var rotation = Quaternion.Euler(0, currentAngle, 0); var projectile = Instantiate(projectilePrefab, transform.position + Vector3.up, rotation); var particleWeapon = projectile.GetComponent(); particleWeapon.SetPower(projectileDamage); particleWeapon.Rb.AddForce(particleWeapon.transform.forward * projectileSpeed); } actions[0].Invoke(); isUsingSkill = false; } } }