📌 문제 상황
유니티에서 캐릭터 이동을 Input.GetAxis로 처리할 때,
애니메이션(Idle ↔ Run) 전환이 자연스럽지 못했고 달리는 동안 다리가 잔망스러웠다
🎯 왜 이런 문제가 생길까?
Input.GetAxis는 키 입력값을 부드럽게 보간한다
키를 눌러도 즉시 1이 아니라 0 → 0.1 → 0.3 → 1처럼 점진적으로 커지고, 키를 떼도 동일하게 서서히 0으로 떨어진다
따라서 키를 눌렀는데 애니메이션이 바로 Run으로 바뀌지 않고 늦게 바뀌며,
키를 떼도 남은 잔류값 때문에 Run이 꺼지지 않았다
추가로 다리가 잔망스럽게 달리는 건
Animator 상태 머신에 트리거 이벤트가 매 프레임 계속 쌓여서 상태가 불필요하게 반복 전환되기 때문이였다
⚡ 즉각 반응을 원하면?
✅ [순서 1] Trigger 대신 bool 파라미터로 전환하기
트리거는 매 프레임 마다 반복 전환되지만,
bool은 값에 따라 상태를 안정적으로 유지할 수 있어 달리는 동안 다리 모션이 자연스럽게 유지된다
✅ [순서 2] Input.GetAxisRaw 사용하기
보간 없이 즉시 -1/0/1 값을 반환하므로,
키 입력에 즉각적으로 반응해 애니메이션 전환이 즉시 된다
단, 아래 영상에서 즉시 전환이 되지 않는 이유는 현재 클립이 재생 중이기 때문이다
✅ [순서 3] Has Exit Time 체크 박스 해제
애니메이션 전환 조건을 만족해도 Has Exit Time이 켜 있으면 현재 클립이 끝날 때까지 기다린 뒤 전환된다
즉각 전환하려면 반드시 이 체크를 해제해야 한다
👉 나 같은 경우는 Run 상태로 넘어갈 때만 Has Exit Time 체크를 해제하면 충분했다
만약 그래도 전환이 즉시 되지 않는다면 Has Exit Time을 끄고 Duration을 0으로 설정하면 된다
🚀 실전 추천 패턴
혼합 패턴을 많이 쓴다
ㄴ 🎮 이동 벡터: GetAxis → 부드럽게 이동
ㄴ 🎞️ 애니메이션: GetAxisRaw → 즉각 전환
💻 코드 예시
// 이동(부드럽게)
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
// 애니메이션 전환(즉시)
float rawHorizontal = Input.GetAxisRaw("Horizontal");
float rawVertical = Input.GetAxisRaw("Vertical");
// 이동 처리
Vector3 dir = new Vector3(horizontal, vertical, 0).normalized;
transform.position += dir * moveSpeed * Time.deltaTime;
// 애니메이션 처리
bool isMoving = rawHorizontal != 0f || rawVertical != 0f;
_animator.SetBool("isRunning", isMoving);
✨ 정리
유니티 이동 코드를 더 자연스럽고 즉각적으로 만들고 싶다면 GetAxis와 GetAxisRaw를 상황에 맞게 분리해서 사용해보자!
'업무_메모' 카테고리의 다른 글
[Unity] 프로퍼티는 왜 직렬화되지 않을까? (0) | 2025.05.05 |
---|---|
[Unity] 유니티6에서 바뀐 씬 등록 방식: Build Settings → Build Profiles (0) | 2025.04.29 |
[Unity] InvalidOperationException: Input.GetKey 사용 시 오류 해결 (0) | 2025.04.17 |
[Unity] 전역 매니저 만들기 (0) | 2025.04.15 |
Visual Studio에서 C# IL 코드 보는 방법 정리 (0) | 2025.04.09 |