오늘은 콤보 공격기능을 구현해봤다. AnimationController 만 가지고 공격 타이밍을 조절 해보려 했지만, 대부분 상대적인 값으로 계산되어 값이 나오기 때문에 구현하는데 쉽지 않다;; 그래서 일단 cooltime 값을 주고 해당 쿨타임에 맞춰서 공격하는 방식으로 구현 했다.
using System.Collections.Generic;
using UnityEditor.Timeline.Actions;
using UnityEngine;
public class ComboAttack : CombatBase
{
private List<ItemWeaponCombatEntity> comboAttacks => EquipEntity.weaponCombatEntities;
private int currentComboIndex = -1;
private int nextComboIndex = -1;
private float comboAttackTime;
private float resetComboTime = 0.5f;
private bool cancelable => currentComboIndex > -1 && comboAttacks.Count > currentComboIndex;
public ComboAttack(CombatSlots combatSlots) : base(combatSlots)
{
}
public override void Update()
{
base.Update();
if (cancelable && Time.time - comboAttackTime > resetComboTime)
{
currentComboIndex = -1;
nextComboIndex = -1;
combatSlots.Animator.SetInteger(combatSlots.AnimationData.ComboAttackIndexHash, 0);
return;
}
if (nextComboIndex > -1 && cooltime <= 0)
{
Attack(nextComboIndex);
}
}
public override void Use()
{
nextComboIndex = GetNextComboIndex(currentComboIndex);
comboAttackTime = Time.time;
}
private void Attack(int comboIndex)
{
if (comboIndex == -1) return;
ItemWeaponCombatEntity combatEntity = comboAttacks[comboIndex];
CombatData combat = new CombatData(combatEntity);
cooltime = combatEntity.cooltime * Defines.ATTACK_ANIMATION_SPEED_OFFSET / combatSlots.Condition.CurrentStat.attackSpeed;
combatSlots.ChangeLayerWeight(EquipEntity.combatStyleType);
combatSlots.Animator.SetFloat(combatSlots.AnimationData.AttackSpeedHash, combatSlots.Condition.CurrentStat.attackSpeed);
combatSlots.Animator.SetTrigger(combatSlots.AnimationData.ComboAttackHash);
combatSlots.Animator.SetInteger(combatSlots.AnimationData.ComboAttackIndexHash, comboIndex + 1);
ApplyAttack(combatEntity.projectilePrefabPath, combat, combatSlots.transform);
currentComboIndex = comboIndex;
}
private int GetNextComboIndex(int comboIndex)
{
if (comboAttacks.Count <= comboIndex + 1)
return 0;
return comboIndex + 1;
}
}
코드를 간략하게 설명하면 외부에서 Use를 호출하면 nextComboIndex를 currentComboIndex 기준으로 가져오게 되는데 Update 함수에서 지속적으로 쿨타임을 확인하면서 Attack 함수 사용 조건이 되면 Attack 함수를 실행하게 된다.
