Posted in: Unity, 프로젝트 When the Spring comes

15. 플레이어 공격 애니메이션 추가

각 방향 1타 2타 공격 애니메이션을 만들었다. 물론 1타만 하여도 모든 방향으로 이동 가능하다.

애니메이션은 모든 경우의 수를 따져서 연결해주는 것이 중요하다. 애니메이션이 추가되면 경우의 수가 늘어난다는 말이 되는데 엄청난 노가다이다..

이동 애니메이션의 한 방향 도식화를 보면 Idle 상태와 움직임 Ready 상태는 서로 이어져있다. 움직이려고 하다가 멈출 수도 있으니 말이다. 움직임 Ready 상태에서 Moving 상태로 가는 건 당연한 것이고 이동을 멈추면 바로 Idle 상태로 간다.

그리고 한 방향이 아니라 8방향으로 이루어져 있는데 어마어마한 노가다 작업이 시작된다.

  • Idle 상태에서 모든 Ready 상태로 전환될 수 있다.
  • Ready 상태에서 다른 방향 Ready 상태로 전환될 수 있다.
  • Ready 상태에서 모든 Idle 상태로 전환될 수 있다.
  • Moving 상태에서 다른 방향 Ready 상태로 전환될 수 있다.
  • Moving 상태에서 모든 Idle 상태로 전환될 수 있다.

이 조건들을 따져서 8방향 이동 애니메이션을 만들었다.

그리고 이제 여기서 1타 2타 공격 애니메이션이 추가되는데

추가한 방식은 위와 같다. Idle, Ready와 Moving 상태에서 바로 1타 공격 모션으로 전환 가능하다. 그리고 나서가 문제인데 방향 키를 계속 누르고 공격을 하는 경우와 방향 키를 안 누르고 공격을 하는 경우가 있다. 그것을 Attack 2와 Attack 2R로 나누었다.

그리고 1타 2타 여부를 기본 공격 스크립트와 연계 했으므로 애니메이션이 끝나면 2타 공격 여부를 결정짓는 bool 변수를 제어하는 것이 중요하다.

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

public class PlayerAnime : MonoBehaviour
{
    public PlayerMove playerMove;
    public Animator animator;
    public Animation animation;

    public bool isAttack;
    public bool secondAttack;

    public int aniDir;
    public int dir;

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

    void Start()
    {
        playerMove = GetComponent<PlayerMove>();

        animator.SetBool("down", true);
    }

    private void Update()
    {
        MovingAnime();

        AttackAnime();
    }

    public void MovingAnime()
    {
        if(GameManager.GetInstance().playerDirection == new Vector3(-1.14f, 0, 1.14f))//UpLeft
        {
            animator.SetBool("inputX", true);
            animator.SetBool("inputZ", true);
            animator.SetBool("upLeft", true);

            animator.SetBool("up", false);
            animator.SetBool("upRight", false);
            animator.SetBool("left", false);
            animator.SetBool("right", false);
            animator.SetBool("downLeft", false);
            animator.SetBool("down", false);
            animator.SetBool("downRight", false);
        }
        if(GameManager.GetInstance().playerDirection == new Vector3(0, 0, 2.0f))//Up
        {
            animator.SetBool("inputX", false);
            animator.SetBool("inputZ", true);
            animator.SetBool("up", true);

            animator.SetBool("upLeft", false);
            animator.SetBool("upRight", false);
            animator.SetBool("left", false);
            animator.SetBool("right", false);
            animator.SetBool("downLeft", false);
            animator.SetBool("down", false);
            animator.SetBool("downRight", false);
        }
        if(GameManager.GetInstance().playerDirection == new Vector3(1.14f, 0, 1.14f))//UpRight
        {
            animator.SetBool("inputX", true);
            animator.SetBool("inputZ", true);
            animator.SetBool("upRight", true);

            animator.SetBool("upLeft", false);
            animator.SetBool("up", false);
            animator.SetBool("left", false);
            animator.SetBool("right", false);
            animator.SetBool("downLeft", false);
            animator.SetBool("down", false);
            animator.SetBool("downRight", false);
        }
        if(GameManager.GetInstance().playerDirection == new Vector3(-2.0f, 0, 0))//Left
        {
            animator.SetBool("inputX", true);
            animator.SetBool("inputZ", false);
            animator.SetBool("left", true);

            animator.SetBool("upLeft", false);
            animator.SetBool("up", false);
            animator.SetBool("upRight", false);
            animator.SetBool("right", false);
            animator.SetBool("downLeft", false);
            animator.SetBool("down", false);
            animator.SetBool("downRight", false);
        }
        if(GameManager.GetInstance().playerDirection == new Vector3(2.0f, 0, 0))//Right
        {
            animator.SetBool("inputX", true);
            animator.SetBool("inputZ", false);
            animator.SetBool("right", true);

            animator.SetBool("upLeft", false);
            animator.SetBool("up", false);
            animator.SetBool("upRight", false);
            animator.SetBool("left", false);
            animator.SetBool("downLeft", false);
            animator.SetBool("down", false);
            animator.SetBool("downRight", false);
        }
        if(GameManager.GetInstance().playerDirection == new Vector3(-1.14f, 0, -1.14f))//DownLeft
        {
            animator.SetBool("inputX", true);
            animator.SetBool("inputZ", true);
            animator.SetBool("downLeft", true);

            animator.SetBool("upLeft", false);
            animator.SetBool("up", false);
            animator.SetBool("upRight", false);
            animator.SetBool("left", false);
            animator.SetBool("right", false);
            animator.SetBool("down", false);
            animator.SetBool("downRight", false);
        }
        if(GameManager.GetInstance().playerDirection == new Vector3(0, 0, -2.0f))//Down
        {
            animator.SetBool("inputX", false);
            animator.SetBool("inputZ", true);
            animator.SetBool("down", true);

            animator.SetBool("upLeft", false);
            animator.SetBool("up", false);
            animator.SetBool("upRight", false);
            animator.SetBool("left", false);
            animator.SetBool("right", false);
            animator.SetBool("downLeft", false);
            animator.SetBool("downRight", false);
        }
        if(GameManager.GetInstance().playerDirection == new Vector3(1.14f, 0, -1.14f))//DownRight
        {
            animator.SetBool("inputX", true);
            animator.SetBool("inputZ", true);
            animator.SetBool("downRight", true);

            animator.SetBool("upLeft", false);
            animator.SetBool("up", false);
            animator.SetBool("upRight", false);
            animator.SetBool("left", false);
            animator.SetBool("right", false);
            animator.SetBool("downLeft", false);
            animator.SetBool("down", false);
        }

        if(GameManager.GetInstance().playerIsMove == true)
            animator.SetFloat("loop", animator.GetCurrentAnimatorStateInfo(0).normalizedTime);
        if(GameManager.GetInstance().playerIsMove == false)//안움직일 때 X Z 끄기
        {
            animator.SetFloat("loop", 0);
            animator.SetBool("inputX", false);
            animator.SetBool("inputZ", false);
        }
    }
    public void AttackAnime()
    {
        if(GameManager.GetInstance().playerIsBasicAttack == true)
            animator.SetBool("attacking", true);
        else if(GameManager.GetInstance().playerIsBasicAttack == false)
            animator.SetBool("attacking", false);

        if(!secondAttack)
        {
            /*** Attack UpLeft ***/
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUpLeft_1") && 
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
            {
                GameManager.GetInstance().playerIsBasicAttack = false;
                animator.SetBool("attacking", false);
            }

            //1타 애니메이션이 끝나기 전
            //짧은 타이밍에 공격 키를 입력한다면
            //2타 애니메이션 출력하게 하는 코드
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUpLeft_1") &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 0.7f)
            {
                if(Input.GetKeyDown(KeyCode.K))
                {
                    secondAttack = true;
                    animator.SetBool("secondAttack", true);
                }
            }
            /*** Attack UpLeft End ***/

            /*** Attack Up ***/
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUp_1") && 
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
            {
                GameManager.GetInstance().playerIsBasicAttack = false;
                animator.SetBool("attacking", false);
            }

            //1타 애니메이션이 끝나기 전
            //짧은 타이밍에 공격 키를 입력한다면
            //2타 애니메이션 출력하게 하는 코드
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUp_1") &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 0.7f)
            {
                if(Input.GetKeyDown(KeyCode.K))
                {
                    secondAttack = true;
                    animator.SetBool("secondAttack", true);
                }
            }
            /*** Attack Up End ***/

            /*** Attack UpRight ***/
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUpRight_1") && 
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
            {
                GameManager.GetInstance().playerIsBasicAttack = false;
                animator.SetBool("attacking", false);
            }

            //1타 애니메이션이 끝나기 전
            //짧은 타이밍에 공격 키를 입력한다면
            //2타 애니메이션 출력하게 하는 코드
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUpRight_1") &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 0.7f)
            {
                if(Input.GetKeyDown(KeyCode.K))
                {
                    secondAttack = true;
                    animator.SetBool("secondAttack", true);
                }
            }
            /*** Attack UpRight End ***/

            /*** Attack Left ***/
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackLeft_1") && 
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
            {
                GameManager.GetInstance().playerIsBasicAttack = false;
                animator.SetBool("attacking", false);
            }

            //1타 애니메이션이 끝나기 전
            //짧은 타이밍에 공격 키를 입력한다면
            //2타 애니메이션 출력하게 하는 코드
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackLeft_1") &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 0.7f)
            {
                if(Input.GetKeyDown(KeyCode.K))
                {
                    secondAttack = true;
                    animator.SetBool("secondAttack", true);
                }
            }
            /*** Attack Left End ***/

            /*** Attack Right ***/
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackRight_1") && 
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
            {
                GameManager.GetInstance().playerIsBasicAttack = false;
                animator.SetBool("attacking", false);
            }

            //1타 애니메이션이 끝나기 전
            //짧은 타이밍에 공격 키를 입력한다면
            //2타 애니메이션 출력하게 하는 코드
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackRight_1") &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 0.7f)
            {
                if(Input.GetKeyDown(KeyCode.K))
                {
                    secondAttack = true;
                    animator.SetBool("secondAttack", true);
                }
            }
            /*** Attack Right End ***/
            

            /*** Attack DownLeft ***/
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDownLeft_1") && 
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
            {
                GameManager.GetInstance().playerIsBasicAttack = false;
                animator.SetBool("attacking", false);
            }

            //1타 애니메이션이 끝나기 전
            //짧은 타이밍에 공격 키를 입력한다면
            //2타 애니메이션 출력하게 하는 코드
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDownLeft_1") &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 0.7f)
            {
                if(Input.GetKeyDown(KeyCode.K))
                {
                    secondAttack = true;
                    animator.SetBool("secondAttack", true);
                }
            }
            /*** Attack DownLeft End ***/
            

            /*** Attack Down ***/
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDown_1") && 
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
            {
                GameManager.GetInstance().playerIsBasicAttack = false;
                animator.SetBool("attacking", false);
            }

            //1타 애니메이션이 끝나기 전
            //짧은 타이밍에 공격 키를 입력한다면
            //2타 애니메이션 출력하게 하는 코드
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDown_1") &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 0.7f)
            {
                if(Input.GetKeyDown(KeyCode.K))
                {
                    secondAttack = true;
                    animator.SetBool("secondAttack", true);
                }
            }
            /*** Attack Down End ***/

            /*** Attack DownRight ***/
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDownRight_1") && 
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
            {
                GameManager.GetInstance().playerIsBasicAttack = false;
                animator.SetBool("attacking", false);
            }

            //1타 애니메이션이 끝나기 전
            //짧은 타이밍에 공격 키를 입력한다면
            //2타 애니메이션 출력하게 하는 코드
            if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDownRight_1") &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f &&
                animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 0.7f)
            {
                if(Input.GetKeyDown(KeyCode.K))
                {
                    secondAttack = true;
                    animator.SetBool("secondAttack", true);
                }
            }
            /*** Attack DownRight End ***/
        }
        /*** Attack UpLeft End ***/
        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUpLeft_2") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }

        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUpLeft_2R") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }
        /*** Attack UpLeft End ***/

        /*** Attack Up ***/
        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUp_2") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }

        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUp_2R") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }
        /*** Attack Up End ***/


        /*** Attack UpRight ***/
        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUpRight_2") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }

        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackUpRight_2R") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }
        /*** Attack UpRight End ***/


        /*** Attack Left End ***/
        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackLeft_2") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }

        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackLeft_2R") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }
        /*** Attack Left End ***/

        /*** Attack Right ***/
        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackRight_2") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }

        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackRight_2R") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }
        /*** Attack Right End ***/

        /*** Attack DownLeft ***/
        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDownLeft_2") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }

        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDownLeft_2R") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }
        /*** Attack DownLeft End ***/

        /*** Attack Down ***/
        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDown_2") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }

        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDown_2R") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }
        /*** Attack Down End ***/

        /*** Attack DownRight ***/
        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDownRight_2") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }

        if(animator.GetCurrentAnimatorStateInfo(0).IsName("AttackDownRight_2R") &&
            animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
        {
            secondAttack = false;
            animator.SetBool("secondAttack", false);
            animator.SetBool("attacking", false);
            GameManager.GetInstance().playerIsBasicAttack = false;
        }
        /*** Attack DownRight End ***/
    }
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다