[Skill] 애니메이션 이벤트를 이용한 콤보 공격



각 공격 애니메이션이 실행되는 동안 애니메이션 이벤트를 통해 실행되는 함수들로 콤보 어택 구현

(1) 애니메이터 뷰로 가서 사용할 공격 애니메이션들을 넣어준다.

image

(2) 공격 애니메이션이 재생 완료되면 다시 Stand 상태로 갈 수 있게 Transition을 만들어 준다.

image

(3) 모든 Transition은 Has Exit Time을 활성화 시켜 애니메이션 재생이 끝나면 Transition을 따라 Stand애니메이션으로 전이 되게 하고, Exit Time과 transitionDuration의 값을 0으로 설정한다.

image

(4) 콤보를 위한 Combo 스크립트를 만든다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Combo : MonoBehaviour
{
    private Animator anim;

    private bool comboPossible;     // 콤보 입력이 가능한지를 판단함
    [SerializeField]
    private int comboStep;          // 콤보 진행 단계
    private bool inputSmash;        // 스매쉬 키의 입력 여부

    private void Awake()
    {
        anim = GetComponent<Animator>();
    }

    // 애니메이션 이벤트에 추가할 함수들

    // 콤보의 시작점(콤보 입력이 가능하게 해줌)
    public void ComboPossible()
    {
        comboPossible = true;
    }

    // 입력된 키와 콤보 단계에 따라서 다음 동작을 재생
    public void NextAtk()
    {
        if (!inputSmash)
        {
            if (comboStep == 2)
                anim.Play("Knight_NormalAtk_B");
            if (comboStep == 3)
                anim.Play("Knight_NormalAtk_C");
        }
        if (inputSmash)
        {
            if (comboStep == 1)
                anim.Play("Knight_SmashAtk_A");
            if (comboStep == 2)
                anim.Play("Knight_SmashAtk_B");
            if (comboStep == 3)
                anim.Play("Knight_SmashAtk_C");
        }
    }

    // 콤보 단계를 초기화 해주는 함수
    public void ResetCombo()
    {
        comboPossible=false;
        inputSmash=false;
        comboStep=0;
    }

    // 기본 공격 기능
    private void NormalAttack()
    {
        if(comboStep == 0)
        {
            // 최초 입력시 첫번째 공격 애니메이션을 재생
            anim.Play("Knight_NormalAtk_A");
            comboStep = 1;
            return;
        }
        if (comboStep != 0)
        {
            if (comboPossible)
            {
                // 무차별 입력을 방지하기 위해 false로 해줌
                comboPossible = false;
                comboStep += 1;
            }
        }
    }

    // 스매쉬 기능(inputSmash를 true로 바꿔 스매쉬 키가 입력된 것만 알려주면 됨)
    private void SmashAttack()
    {
        if (comboPossible)
        {
            comboPossible = false;
            inputSmash = true;
        }
    }

    private void Update()
    {
        if(Input.GetMouseButtonDown(0))
            NormalAttack();

        if(Input.GetMouseButtonDown(1))
            SmashAttack();
    }
}

(5) Combo스크립트를 Player에게 넣어주고, 애니메이션 클립에 이벤트를 설정해준다.

(6) 콤보 입력을 받을 부분에 이벤트를 추가한다.(ComboPossible()함수 선택)

image

(7) 다음 공격을 재생할 타이밍에 이벤트를 추가한다.(NextAtk()함수 선택)

image

(8) 애니메이션이 끝나는 부분에 이벤트를 추가한다.(ResetCombo()함수 선택)

image-20220409152340413

(9) 위와 같은 방식으로 NormalAttack 애니메이션에 이벤트를 추가한다.

(10) Smash는 이어지는 콤보 동작이 없는 마무리 동작이므로 애니메이션 마지막에 ResetCombo()함수만 추가해준다.

(11) 애니메이션 재생속도를 1.5로 바꾼다.

이제 실행하면 입력된 키에 따라 콤보 어택이 가능한 모습을 볼 수 있다.




© 2022. by KSC

Powered by sora