이동 애니메이션 디테일
현재 걷는 모션과 뛰는 모션 사이 그리고 걷는 모션과 멈추는 모션의 사이 등이 조금 어색한 부분이 있다.
걷기에서 뛰기로 모션이 전환될 때 너무 빠르게 전환되는 문제나 멈출 때 등 어색한 부분을 개선해 보자.
그리고 점프에서도 어색한 부분이 있다.
걷기 애니메이션
현재 걷는 모션에서 뛰는 모션으로 전환될 때 너무 빠르게 전환되어 속도가 갑자기 변하는 것처럼 끊겨보이는 느낌이 든다.
if (!animator.IsUnityNull())
{
_animSpeed = Mathf.Lerp(_animSpeed, _targetSpeed, Time.deltaTime * playerMovementData.speedChangeRate);
animator.SetFloat(SpeedAnimID, _animSpeed);
}
이 부분에서 speedChangeRate에 의해 애니메이션 보간 속도를 조정하기 때문이다.
이는 현재 10으로 설정되어 있어 매우 빠르게 애니메이션이 보간되며 전환된다.
이를 줄이면 자연스러운 처리가 가능하다.
![]() |
![]() |
| speedChangeRate = 10 | speedChangeRate = 2 |
자연스러운 감속 가속이 가능해졌다.
하지만 문제가 하나 생긴다.
speedChangeRate는 애님 보간 속도이기 때문에 걷다가 멈추는 모션으로 전이가 느려지는 문제가 발생한다.

입력을 하지 않아도 계속 앞으로 걸어나가게 된다.
이는 상태 전이의 조건이 애님 보간이 0.1미만으로 떨어지면 Idle로 전이되기 때문이다.

만약 전이 조건을 올리게 되면 걷는 도중에 해당 조건 미만에 걸리게 되면 Idle로 전이되기 때문에 문제가 발생한다.
따라서 입력이 없으면 빠르게 감소하도록 보정값을 곱해줘야 할 것 같다.
float inputMagnitude = 1f;
if (parkourInputController.moveInput != Vector2.zero)
{
...
}
else
{
inputMagnitude = playerMovementData.decelerateRate;
_targetSpeed = 0f;
}
...
if (!animator.IsUnityNull())
{
_animSpeed = Mathf.Lerp(_animSpeed, _targetSpeed, Time.deltaTime * playerMovementData.speedChangeRate * inputMagnitude);
animator.SetFloat(SpeedAnimID, _animSpeed);
}
decelerateRate를 설정하여 감속 계수를 설정해 주었다.

점프 애니메이션
현재 점프 애니메이션에서 어색한 부분은 뛰는 위치보다 높은 위치에 착지한다면 애니메이션인 튀는 현상이 있다.

이를 개선하기 위해서는 지면 체크 부분을 수정해야 할 것이다.
점프에서 랜딩으로 전이되는 조건이 땅에 닿았을 때이기 때문에 이를 적절히 수정하여 자연스럽게 보간해야 할 것 같다.
해당 경우는 점프할 때만 발생하기 때문에 정점을 찍은 후 지면 체크 조건을 변경해 해결하면 될 것 같다.
정점 이후 지면 체크 위치를 왼발과 오른발의 위치로 변경하면 좀 더 자연스러울 것 같다.
일단은 점프 중에만 왼발과 오른발을 트래킹하여 위치를 받아올 수 있게 트래커를 만들었다.
public class FootTracker : MonoBehaviour
{
[SerializeField] private GameObject leftFoot;
[SerializeField] private GameObject rightFoot;
public Vector3 leftFootPosition;
public Vector3 rightFootPosition;
private void Update()
{
leftFootPosition = leftFoot.transform.position;
rightFootPosition = rightFoot.transform.position;
}
}
이후, 지면 체크에서 이를 활용하였다.
if (_isJumping)
{
_grounded = false;
// 왼발
{
var checkPosition = footTracker.leftFootPosition;
checkPosition.y -= playerMovementData.groundedOffset;
_grounded |= Physics.CheckSphere(checkPosition, playerMovementData.groundedRadius, playerMovementData.groundLayer, QueryTriggerInteraction.Ignore);
}
// 오른발
{
var checkPosition = footTracker.rightFootPosition;
checkPosition.y -= playerMovementData.groundedOffset;
_grounded |= Physics.CheckSphere(checkPosition, playerMovementData.groundedRadius, playerMovementData.groundLayer, QueryTriggerInteraction.Ignore);
}
}

이제 경사면 혹은 높은 지면에서 발보다 먼저 지면에 닿아 착지 애니메이션이 실행되지 않도록 할 수 있다.

