
각 방향 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 ***/
}
}