WWolves Den

애니메이션 · 약 3분

Velocity에서 Ground Speed 계산하기

방향이 있는 속도 벡터를 애니메이션에 필요한 수평 속력으로 바꾸고, 좌표계의 전제를 확인합니다.

Wolfgadeok · 업데이트

속도 벡터와 속력은 다르다

Velocity에는 어느 방향으로 얼마나 빠르게 움직이는지가 함께 들어 있다. 반면 걷기와 달리기를 섞는 단순한 Blend Space는 이동 방향보다 빠르기 하나만 필요할 수 있다. 이때 벡터의 길이를 구해 방향 정보를 제거한다. 여기서 계산할 Ground Speed는 그중 수평면에 해당하는 성분만 이용한 값이다.

기본적인 Z축 위쪽 좌표계에서 수평 속력은 X와 Y 성분의 길이다. 점프하면 Z 속도가 커지지만 제자리 점프를 달리기로 보이게 하고 싶지는 않다. 그래서 전체 3차원 길이 대신 Vector Length XY를 사용하는 이유가 생긴다. 이것은 모든 게임에 보편적인 공식이 아니라 어떤 평면을 지면으로 볼지 정한 설계다.

갱신 흐름을 분명하게 만든다

초기화에서 보관한 Movement Component는 같은 컴포넌트를 가리키는 참조다. 업데이트 때마다 그 대상의 현재 Velocity 값을 읽어 애니메이션 변수에 저장할 수 있다. 컴포넌트를 한 번 복사해 두고 내부 속도가 저절로 바뀌는 구조로 이해하지 않는다.

  1. Animation Blueprint가 사용하는 이동 컴포넌트 참조가 현재 캐릭터의 것인지 확인한다.
  2. 유효한 참조에서 Velocity를 읽고 Vector Length XY로 Ground Speed를 구한다.
  3. AnimGraph의 이동 Blend Space 입력에 그 변수를 연결한다.
  4. 정지, 직선 이동, 대각선 이동, 제자리 점프를 나누어 값과 모션을 관찰한다.
  5. 실제 최대 이동 속도와 Blend Space 축 범위가 맞는지 확인한다. 축의 끝값을 과거 예제의 숫자에 무조건 맞추지 않는다.
Movement Component의 Velocity에서 Vector Length XY로 Ground Speed를 구하는 그래프
수평 속도는 Velocity의 X·Y 성분으로 계산합니다. 아래쪽에 일부 보이는 Should Move 조건은 게임의 이동 규칙에 따라 별도로 구성합니다. 이전 버전의 에디터 화면으로, 현재 버전과 메뉴 배치가 다를 수 있습니다. 이미지를 누르면 크게 볼 수 있습니다.

계산을 작은 수로 검산하기

Velocity가 (300, 400, 0)이면 수평 속력은 500이다. 같은 캐릭터가 위로 뛰어 (300, 400, 200)이 되더라도 XY 기준 속력은 500으로 유지된다. 대각선 입력에서 각 축의 값만 따로 비교하면 실제 빠르기를 잘못 판단할 수 있으므로 벡터 길이로 검산한다.

예제 · text

GroundSpeed = sqrt(Velocity.X² + Velocity.Y²)
Velocity (300, 400,   0) -> GroundSpeed 500
Velocity (300, 400, 200) -> GroundSpeed 500
Velocity (  0,   0, 200) -> GroundSpeed   0

예외가 생기는 이동 방식

벽 걷기, 구형 행성, 사용자 지정 중력에서는 월드 XY가 캐릭터의 지면과 일치하지 않을 수 있다. 이동 플랫폼 위의 상대 이동이나 넉백을 어떤 애니메이션으로 표현할지도 선택해야 한다. 그런 프로젝트에서는 기준 평면에 투영한 속도나 캐릭터 로컬 공간의 속도를 사용하는 설계를 검토한다.

값이 올바른데 발이 미끄러져 보인다면 속력 계산만의 문제는 아닐 수 있다. 원본 동작의 보폭, 재생 속도, 캐릭터 이동 속도가 서로 맞는지도 확인한다. 수치를 부드럽게 만들기 전에 먼저 무엇을 측정하고 있는지부터 정확히 한다.

참고 자료

예제는 학습용이며, 모든 환경에서 실행 검증된 완성 프로젝트는 아닙니다. 적용 전 사용 중인 버전과 프로젝트 환경에서 동작을 확인하세요.