WWolves Den

애니메이션 · 약 3분

Should Move와 Is Falling을 설계하는 기준

입력 의도, 실제 속도, 이동 모드를 구분해 잘못된 걷기·점프 전환을 줄입니다.

Wolfgadeok · 업데이트

플래그 이름보다 계산 조건을 본다

Should Move는 엔진 전체에 고정된 하나의 의미를 갖는 마법 변수라기보다 해당 Animation Blueprint가 이동 모션을 켤지 판단하기 위한 값이다. 예를 들어 Ground Speed가 작은 임계값보다 크고 현재 가속도도 의미 있게 존재할 때 참이 되도록 구성할 수 있다. 이 조건이 자신의 게임에도 맞는지 따져야 한다.

Get Current Acceleration을 '사용자가 이동키를 누르는지 확인하는 함수'라고 설명하면 범위가 너무 좁아진다. 이 값은 이동 컴포넌트의 상태이며 키보드의 직접 입력 조회가 아니다. AI 이동, 네트워크 캐릭터, 입력 처리 방식에 따라 사용자의 물리 키 상태와 일대일 대응하지 않을 수 있다.

속력과 가속도 조건으로 Should Move를 구하고 이동 컴포넌트에서 Is Falling을 읽는 그래프
위쪽은 속력과 가속도 조건을 조합하는 예시이고, 아래쪽은 낙하 이동 상태를 읽는 흐름입니다. 3.0은 예제 임계값이며 가속도를 키보드 입력 자체와 동일하게 해석하지 않습니다. 이전 버전의 에디터 화면으로, 현재 버전과 메뉴 배치가 다를 수 있습니다. 이미지를 누르면 크게 볼 수 있습니다.

의도와 결과를 다른 값으로 둔다

캐릭터가 벽에 막히면 이동 의도는 있어도 수평 속력은 거의 없을 수 있다. 넉백이나 이동 플랫폼 때문에 움직이면 입력이 없어도 속력은 생길 수 있다. 이 두 상황을 같은 걷기 모션으로 표현할지, 버티기나 피격 모션으로 분리할지는 게임 디자인의 문제다.

따라서 플래그를 하나의 긴 논리식으로 숨기기보다 HasMovementIntent와 GroundSpeed처럼 이유를 구분해 살펴보면 좋다. 최종 ShouldMove는 그 값들을 게임의 규칙에 맞게 조합한다. 변수 이름만 복사해서 상태 머신에 넣으면 이런 차이가 드러나지 않는다.

임계값 주변의 떨림을 점검하기

정지 근처의 작은 속도 변화가 걷기·서기 전환을 반복시킬 수 있다. 속력 임계값으로 3.0 같은 수치를 사용하더라도 이는 예제값이지 모든 캐릭터에 맞는 표준은 아니다. 먼저 실제 값의 범위를 관찰하고 필요하면 이동 진입과 정지 복귀의 기준을 다르게 두는 방법을 검토한다. 이 역시 의도한 반응성을 보존하며 시험해야 한다.

  1. 정지와 걷기를 천천히 반복하며 속력·가속도·ShouldMove를 동시에 관찰한다.
  2. 벽에 막힌 상태, 키를 뗀 직후 감속, 넉백, AI 이동을 따로 재현한다.
  3. 작은 수치 변화 때문에 전이가 반복되는지 확인하고, 필요하면 진입·이탈 임계값을 분리한다.
  4. Blend Space 입력 보간과 상태 전이 시간이 함께 과도한 지연을 만들지 않는지 확인한다.

Is Falling은 점프 버튼의 다른 이름이 아니다

Character Movement의 IsFalling은 낙하 이동 모드에 있는지를 나타낸다. 위로 점프하는 동안에도 참일 수 있고, 버튼을 누르지 않고 절벽에서 걸어 떨어져도 참일 수 있다. 반대로 수영·비행 등 다른 이동 모드는 별개의 상태다.

상승과 하강의 연출을 나누려면 낙하 상태뿐 아니라 수직 속도나 점프를 시작한 이벤트 등 추가 정보를 설계해야 한다. IsInAir라는 사용자 변수 이름이 보인다고 다른 엔진 버전에서 IsFalling API가 단순히 개명됐다고 판단하지 않는다.

참고 자료