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