먼저 Player에 Animator 컴포넌트를 추가하고 Animator Controller를 Resources->Animations->Player 폴더에 추가한 후 Animator 컴포넌트에 등록해준다.
그리고 Tiny RPG Forest -> Artwork -> sprites -> hero에 있는 애니메이션의 Pixels per unit을 20으로 전부 맞춰주고 드래그해서 플레이어 오브젝트에 드래그 앤 드롭해주고 anim 파일을 생성해서 Resources->Animations->Player 폴더에 전부 저장해둔다.
그러면 아래와 같이 anim 파일이 자동으로 Animator에 등록되어 있는 것을 볼 수 있다.

하지만 애니메이션 스프라이트가 걷기나 어택같이 여러개로 있는 것과는 달리, idle 같은 경우는 하나만 존재하는데 이 경우 똑같이 드래그 앤 드롭하지 말고 Animation 윈도우에서 Create New Clip을 클릭해서 추가해주자

그리고 Idle 스프라이트를 드래그 앤 드롭하여 아래 사진처럼 등록하면 된다.

public class PlayerController : MonoBehaviour
{
...
Animator _animator;
MoveDir _dir = MoveDir.Down; // None으로 하면 set에서 return하기 때문에 시작하자마자 Right 방향으로 무한 워킹
public MoveDir Dir
{
get { return _dir; }
set
{
if (_dir == value)
return;
switch(value)
{
case MoveDir.Up:
_animator.Play("WALK_BACK");
transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
break;
case MoveDir.Down:
_animator.Play("WALK_FRONT");
transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
break;
case MoveDir.Left:
_animator.Play("WALK_RIGHT");
transform.localScale = new Vector3(-1.0f, 1.0f, 1.0f); // 왼쪽 애니메이션은 따로 만들지 않고 x축 기준으로 좌우 대칭만 해주면 된다.
break;
case MoveDir.Right:
_animator.Play("WALK_RIGHT");
transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
break;
case MoveDir.None:
if(_dir == MoveDir.Up)
{
_animator.Play("IDLE_BACK");
transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
}
else if(_dir == MoveDir.Down)
{
_animator.Play("IDLE_FRONT");
transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
}
else if (_dir == MoveDir.Left)
{
_animator.Play("IDLE_RIGHT");
transform.localScale = new Vector3(-1.0f, 1.0f, 1.0f);
}
else
{
_animator.Play("IDLE_RIGHT");
transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
}
break;
}
_dir = value;
}
}
void Start()
{
_animator = GetComponent<Animator>();
...
}
void Update() { ... }
void UpdatePosition() { ... }
void GetDirInput()
{
if (Input.GetKey(KeyCode.W))
Dir = MoveDir.Up;
...
}
void UpdateMoving() { ... }
}
위 로직처럼 구현하면 GetDirInput에서 인풋을 입력하는 즉시 방향이 _dir = value로 인해 갱신되며 애니메이션이 즉시 출력된다.
그리고 정지할때도 가장 최근에 이동했던 방향이 _dir에 남아있으니까 _dir을 MoveDir.None으로 갱신하기 전에 _dir의 방향에 맞춰 IDLE 애니메이션을 재생시켜주었다.