[TIL] 콤보 공격 구현

Dreamer·2024년 11월 19일

1. 오늘 주제

오늘은 콤보 공격기능을 구현해봤다. AnimationController 만 가지고 공격 타이밍을 조절 해보려 했지만, 대부분 상대적인 값으로 계산되어 값이 나오기 때문에 구현하는데 쉽지 않다;; 그래서 일단 cooltime 값을 주고 해당 쿨타임에 맞춰서 공격하는 방식으로 구현 했다.

2. 코드

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 함수를 실행하게 된다.

  • 결과물
profile
새로운 시작

0개의 댓글