OldBlueWater/BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros/HammerSlam.cs

117 lines
4.3 KiB
C#

using System;
using System.Collections;
using BlueWaterProject;
using Sirenix.OdinInspector;
using UnityEngine;
// ReSharper disable once CheckNamespace
namespace RhinocerosSkill
{
public class HammerSlam : BaseSkill
{
[Title("추가 옵션")]
[SerializeField] private float hammerOffset = 3f;
private Collider[] hitColliders;
protected override void BasicSetting()
{
base.BasicSetting();
hitColliders = new Collider[5];
}
public override bool EnableSkill()
{
if (!enableSkill) return false;
var targetDistance = Vector3.Distance(SkillInputData.Transform.position,
SkillInputData.TargetCollider.transform.position);
return targetDistance <= SkillData.Range + hammerOffset;
}
public override void ActivateSkill(params Action[] actions)
{
enableSkill = false;
StartCoroutine(SkillCoroutine(actions));
}
private IEnumerator SkillCoroutine(params Action[] actions)
{
var iAnimationStateController = SkillInputData.IAnimationStateController;
iAnimationStateController.SetAnimationParameter(RhinocerosAnimationParameter.SKILL_INDEX, 1);
var animationStarted = false;
yield return StartCoroutine(iAnimationStateController.WaitForAnimationToRun(RhinocerosAnimationName.HAMMER_SLAM,
success => animationStarted = success));
if (!animationStarted)
{
EndSkill(0, actions[0]);
yield break;
}
var startPosition = SkillInputData.Transform.position;
var targetPosition = SkillInputData.TargetCollider.transform.position;
var vectorToTarget = targetPosition - startPosition;
vectorToTarget.y = 0f;
var targetToDirection = vectorToTarget.normalized;
transform.position = startPosition + targetToDirection * hammerOffset;
transform.localScale = Vector3.one * (SkillData.Range * 2f);
actions[1].Invoke();
ShowIndicator();
var elapsedTime = 0f;
var fill = 1 / SkillData.CastingTime;
while (elapsedTime < SkillData.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 hitCount = Physics.OverlapSphereNonAlloc(transform.position, SkillData.Range, hitColliders, SkillInputData.TargetLayer);
for (var i = 0; i < hitCount; i++)
{
var iDamageable = hitColliders[i].GetComponent<IDamageable>();
iDamageable?.TakeDamage(SkillData.Damage);
var combatStatus = hitColliders[i].transform.GetComponent<CombatStatus>();
if (combatStatus != null)
{
var targetToVector = hitColliders[i].transform.position - transform.position;
targetToVector.y = 0f;
var direction = targetToVector.normalized;
combatStatus.Stun(0.05f);
combatStatus.GetComponent<Rigidbody>().AddForce(direction * 20f, ForceMode.Impulse);
}
}
HideIndicator();
while (SkillInputData.IAnimationStateController.IsComparingCurrentAnimation(RhinocerosAnimationName.HAMMER_SLAM)
&& SkillInputData.IAnimationStateController.GetCurrentAnimationNormalizedTime() <= 1f)
{
yield return null;
}
EndSkill(SkillData.Cooldown, actions[0]);
}
private void EndSkill(float cooldown, Action action)
{
SkillInputData.IAnimationStateController.SetAnimationParameter(RhinocerosAnimationParameter.SKILL_INDEX, -1);
StartCoroutine(Utils.CoolDown(cooldown, () => enableSkill = true));
action?.Invoke();
}
}
}