OldBlueWater/BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros/HammerAttack.cs
NTG b021b6ba6b Combat씬 보완하기
+ 우측 상단에 개발자 모드 Toggle 기능 추가
+ 전투 플레이어의 HpBar 추가
+ 전투 플레이어가 공격 시 이펙트 추가
+ 승회님 포레스트 맵에 잡몹 추가
+ 승회님 2D 나무 sorting Layer 플레이어와 동일하게 변경
+ 코뿔소 스킬마다 넉백 효과 짧고 굵게 변경
+ 코뿔소 돌진 스킬 넉백 로직 변경
+ 코뿔소 지진 스킬 이펙트 추가
+ StylizedAllEffect 에셋 추가
2024-02-19 20:40:16 +09:00

97 lines
3.4 KiB
C#

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 * 2f);
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>();
iDamageable?.TakeDamage(Damage);
var iCombatable = hitColliders[i].GetComponent<ICombatable>();
if (iCombatable != null)
{
var targetToVector = hitColliders[i].transform.position - transform.position;
targetToVector.y = 0f;
var direction = targetToVector.normalized;
iCombatable.DisableMove(0.05f);
iCombatable.AddForceToDirection(direction, 20f);
}
}
HideIndicator();
while (SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).IsName("HammerAttack") &&
SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f)
{
yield return null;
}
actions[0].Invoke();
}
}
}