말감로그

[Unity] Valley - 플레이어 이동 & 애니메이션(Blend Tree) 본문

TIL

[Unity] Valley - 플레이어 이동 & 애니메이션(Blend Tree)

habbn 2024. 10. 14. 16:42
728x90

 

플레이어 애니메이션은 Blend Tree를 사용해봤다.

 

Blend Tree 애니메이션은 여러 애니메이션 클립을 하나의 트리에 넣고, 캐릭터의 속도, 방향, 각도 등을 기준으로 자동으로 애니메이션을 혼합하고 전환할 수 있다.

 

전체적인 애니메이션은 이런식으로 관리해놨다. 각 애니메이션 트리를 생성해주고

 

해당 애니메이션 블랜드 트리 안에 Front, Back, Left, Right 애니메이션을 연결해 준뒤, 

 

파라미터를 생성해 각 애니메이션에 맞게 값을 주면 해당 값이 변할 때마다 각 애니메이션으로 실행되게 된다.

Horizontal이 아닌 LastHorizontal로 준 이유는 애니메이션이 이동하다 멈추면 정면을 바라보게 되어있어서, 마지막 누른 키를 저장 후 그 방향을 바라보게 하였다.

 

public class Player : MonoBehaviour
{
    public float moveSpeed = 5;
    Rigidbody2D rb;
    Vector2 movement;
    Vector2 lastMoveDirection;
    Animator anim;
    bool isMove;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
    }

    void Update()
    {
        GetInput();
        UpdateAnimation();
    }
    
    void FixedUpdate()
    {
        Move();
    }

    void Move()
    {
        rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
    }
    
    void GetInput()
    {
        movement.x = Input.GetAxisRaw("Horizontal");
        movement.y = Input.GetAxisRaw("Vertical");
        
        // 대각선 이동 시 속도 일정하게 유지
        if (movement.magnitude > 1)
        {
            movement = movement.normalized;
        }

        // 마지막 이동 방향 저장
        if (movement != Vector2.zero)
        {
            lastMoveDirection = movement;
        }
    }
    
    void UpdateAnimation()
    {
        // walk
        anim.SetFloat("Horizontal", movement.x);
        anim.SetFloat("Vertical", movement.y);
        anim.SetFloat("Speed", movement.sqrMagnitude);

        // idle
        if (movement.sqrMagnitude == 0)
        {
            anim.SetFloat("LastHorizontal", lastMoveDirection.x);
            anim.SetFloat("LastVertical", lastMoveDirection.y);
        }
    }
}

 

 

728x90