Player 애니메이션

Eunho Bae·2022년 5월 18일

세팅

먼저 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 스프라이트를 드래그 앤 드롭하여 아래 사진처럼 등록하면 된다.

PlayerController에서 애니메이션 스크립트 작성

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 애니메이션을 재생시켜주었다.

profile
개인 공부 정리

0개의 댓글