저자: DarkFlameMaster
최근 언리얼 엔진의 골격 애니메이션 관련 지식을 공부하고 있다. 가르치면서 배우자는 생각으로, 여기서 애니메이션 관련 글을 좀 써서 방금 배운 것을 바로 팔아먹어보려 한다.
1. 기본 개념
우리가 지금 걷기/달리기 블렌드 애니메이션을 만들려고 한다고 가정해보자. 만약 애니메이션 블루프린트, 블렌드 스페이스, 상태 머신을 아주 기본적으로만 배웠다면, 만들어지는 결과는 아마 대충 이런 모습일 가능성이 높다.

단순히 플레이어의 이동 속도를 사용해서 걷기에서 달리기로 넘어가는 애니메이션 블렌드를 제어하는 방식이다.
하지만 완성도 있는 걷기/달리기 블렌드는 그렇게 단순하지 않다. 여기서는 Advanced Locomotion System 안의 걷기/달리기 블렌드를 예로 들어 간단히 이야기해보자.
우선 몇 가지 개념을 명확히 하자.
보행 상태(Gait): 캐릭터가 현재 걷기, 조깅, 전력 질주 세 상태 중 어디에 있는지를 뜻한다. 캐릭터의 보행 상태는 플레이어의 키 입력 제어에만 의존해야 하며, 캐릭터의 현재 이동 속도에 의존해서는 안 된다.
보폭(Stride): 캐릭터가 현재 한 걸음을 내딛는 폭을 뜻한다. 같은 시간 안에서 캐릭터의 보폭이 클수록 이동 속도는 더 빨라진다. 반대로 말하면 속도가 빠를수록 보폭도 커져야 한다. 따라서 보폭은 애니메이션이 충분히 자연스럽게 보이도록 반드시 조정해야 하는 값이며, 플레이어의 속도와 연결되어 있다.
걸음 빈도/보행 주파수: 같은 시간 안에서 보폭이 동일하다면, 걸음 빈도가 높을수록 플레이어의 이동 속도는 더 빨라진다. 이 말은 누구나 아는 쓸데없는 소리처럼 보이지만, 사실 중요한 사실 하나를 드러낸다. 즉, 걷기와 달리기는 완전히 같은 속도에서도 서로 다른 보폭을 가질 수 있다.
왜 단순히 속도만으로 1차원 블렌드 스페이스의 걷기/달리기 블렌드를 제어하면 안 된다고 말하는가? 우선 걷기 애니메이션과 달리기 애니메이션을 직접 1D 블렌드하면 보폭 차이를 제대로 드러낼 수 없다. 걷기 애니메이션도 달리기 애니메이션과 같은 보폭을 가질 가능성이 충분히 있다. 설령 1차원 블렌드 스페이스 축 위에 세 애니메이션—정지 자세, 걷기 애니메이션, 달리기 애니메이션—을 올려둔다 해도, 속도가 걷기 속도를 넘지 않을 때에만 속도로 보폭을 제어할 수 있다.
마찬가지로 걸음 빈도도 정확히 제어되어야 한다. 우리는 재생 속도를 사용해 캐릭터의 걸음 빈도를 제어해야지, 걷기와 달리기 애니메이션의 블렌드로 제어해서는 안 된다. (걷기의 걸음 빈도는 달리기보다 느리다.)
따라서 보폭과 걸음 빈도를 동시에 제어할 수 있는 걷기/달리기 블렌드 애니메이션을 원한다면, 블렌드 스페이스를 이런 식으로 만들어야 한다.

(2022.6.13 업데이트:
팀장과 이야기한 뒤, 여기에는 세 가지 디테일이 있다는 것을 깨달았다.
- ALS가 Idle → Walk → Run 형태의 1차원 블렌드 스페이스를 만들지 않은 이유는, 현실에서 50m 달리기를 할 때의 동작은 처음부터 달리기로 가속해야 하기 때문이다. 만약 먼저 정지에서 “걷기”로 가속하고, 다시 “걷기”에서 달리기로 가속한다면 매우 어색해 보인다. 그래서 2차원 블렌드 스페이스로 만들고, 걷기 시작과 달리기 시작을 위아래 두 경로로 나누어야 한다. 물론 걷기와 달리기를 각각 1차원 블렌드 스페이스로 만들고, 다시 Select로 고르는 방식도 가능하다.
- ALS가 블렌드 스페이스의 가장 왼쪽에 둔 것은 Idle 자세가 아니라, 설계된 정적인 자세이며 걷기와 달리기마다 서로 다르다. 이는 Idle에서 곧바로 걷기/달리기로 블렌드하면 약간 어색하고, ALS의 작가는 별도의 출발 애니메이션 리소스를 만들지 않았기 때문이다. 그래서 ALS는 가장 왼쪽 애니메이션을 “준비 자세”(달리기 전에 취하는 그 준비 자세)로 만들고, 이 준비 자세와 달리기 애니메이션을 보폭 기준으로 블렌드하여 “출발” 과정을 근사적으로 얻는다.

)
Walk/Run이라는 보행 상태 변수를 이용해 걷기-달리기 블렌드를 제어하고, 보폭(Stride)을 이용해 정지 자세-이동 애니메이션의 블렌드를 제어한다.
재생 속도는 블렌드 스페이스 플레이어 노드에서 핀으로 노출해야 한다.

이 세 변수에 기대면, 우리는 일단 비교적 자연스러운(최초의 원시적인 방식보다는 자연스럽다는 의미의) 걷기/달리기 블렌드 애니메이션을 만들 수 있다. (가속할 때의 무게중심 전방 기울기, 방향 전환 시 무게중심 이동, 8방향 이동 블렌드 등은 뒤에서 다시 이야기하자.)
이제는 이 세 값을 어떻게 계산할지만 생각하면 된다.
2. 세 값의 계산
2.1 WalkRunBlend(보행 상태)
먼저 걷기/달리기 블렌드—WalkRunBlend를 계산한다. 앞에서 말했듯이 보행 상태는 이동 속도가 아니라 플레이어의 키 입력 제어에만 의존해야 한다. 따라서 WalkRunBlend의 값이 0인지 1인지를 정하려면, 현재 플레이어의 키 입력이 내린 명령이 달리기인지 걷기인지 판단하기만 하면 된다.
그래서 캐릭터 블루프린트에 이런 코드를 작성할 수 있다.

그리고 애니메이션 블루프린트에서 Gait 값을 읽으면, 이때 플레이어가 내린 이동 명령을 판단할 수 있다.

우리의 걷기/달리기 블렌드 스페이스에는 walk와 run 두 종류의 애니메이션만 사용되며, 전력 질주(Sprint) 애니메이션은 사용하지 않는다. 그래서 현재는 임시로 전력 질주와 달리기를 모두 run으로 보고 반환값을 1로 둔다.
2.2 보폭
캐릭터가 정지 상태에서 움직이기 시작할 때, 속도는 먼저 빨라졌다가 나중에 느려지는 식으로 변화한다. 예를 들어 정지 → 걷기, 정지 → 달리기가 그렇다. 속도가 점차 올라가는 과정에서 같은 보폭의 애니메이션만 사용하면 부자연스럽게 보인다. 앞에서 말했듯 같은 시간 안에서는 보폭이 클수록 이동 속도도 커져야 한다. 그런데 이렇게 가속하는 과정에서 속도는 변하는데 보폭은 변하지 않는다면, 당연히 자연스럽지 않다.
따라서 속도의 상승에 따라 보폭도 함께 상승하는 함수를 설계해야 한다. 보폭이 속도 증가에 따라 선형적으로 증가하게 해도 되지만, ALSV4 시스템에서는 커브를 사용해 이를 묘사한다. 우리는 그냥 그 커브를 직접 보면 된다.
아래 그림은 달리기 보행 상태에서 속도 변화에 따른 보폭 커브다. (걷기 애니메이션과 달리기 애니메이션은 원래부터 기본 보폭과 보행 빈도가 다르기 때문에, 걷기 보행 상태의 보폭 커브와 달리기 보행 상태의 보폭 커브는 각각 따로 만들어야 한다.)

이제 문제는 우리가 어느 보폭 커브를 사용할지 결정해야 한다는 점이다. 다시 말해 지금 캐릭터가 걷고 있는지 달리고 있는지를 판단해야 한다. 이 질문에 답하는 것은 아주 간단하다. 이전 절의 보행 상태(Gait) 변수를 이용하면 된다.
그림처럼, 먼저 걷기/달리기 보폭 커브 리소스 인스턴스를 가져오고, 캐릭터의 구체적인 이동 속도에 따라 대응하는 보폭 크기를 얻은 뒤, 보행 상태가 걷기인지 달리기인지 전력 질주인지, 서 있는 상태가 서기인지 웅크리기인지에 따라 어느 보폭 커브를 사용할지 결정한다……

이것은 가능한 방법이다. 하지만 이렇게 하면 유연성이 약간 부족하고, 또 한 가지 문제가 있다.
현재 우리의 로직은 이렇다. 키 입력 명령 → 보행 상태 변수(Gait) → 사용하는 애니메이션 시퀀스. 여기에는 작은 문제가 있다. 보행 상태 변수는 열거형 값이고, 상태가 몇 개뿐이다. 걷기 아니면 달리기다. 만약 보행 상태에 따라 사용할 보폭 커브가 걷기인지 달리기인지 결정한다면, 사실 별 문제는 없다.
하지만 우리가 사용하는 것은 애니메이션 시퀀스가 아니라 블렌드 스페이스다.
즉, 걷기 보폭 커브와 달리기 보폭 커브만으로는 충분하지 않다. 우리는 걷기와 달리기 사이에 놓인 중간 상태의 보폭 커브가 필요하다. 따라서 보행 상태(Gait)로 두 보폭 커브 중 하나를 직접 선택해서는 안 되고, 걷기 보폭 커브와 달리기 보폭 커브를 보간하여 중간 상태를 얻어야 한다.

그렇다면 이제 문제는 이렇게 바뀐다. 캐릭터가 걷기/달리기 전환을 할 때, 애니메이션이 구체적으로 Walk/Run이라는 수직축의 어느 위치에 있는지를 우리는 어떻게 알 수 있는가? 이 값은 걷기 보폭 커브와 달리기 보폭 커브를 보간할 때 양쪽의 가중치를 직접 결정한다.
답은 **【커브】**다. (애니메이션 시퀀스 안의 커브다.)
커브라는 것은 애니메이션 블루프린트에서 가져올 수 있다. (찾고자 하는 커브 이름만 알고 있다면.) 블렌드 스페이스는 기본적으로 애니메이션 안의 커브도 함께 블렌드한다. 따라서 걷기 애니메이션에 Weight_Gait라는 이름의 커브를 추가하고 그 값을 항상 1로 두며, 달리기 애니메이션에도 같은 이름의 Weight_Gait 커브를 추가하고 그 값을 항상 2로 두면 된다.

그러면 걷기/달리기 전환 시 블렌드 스페이스의 녹색 애니메이션 포인터가 아래에서 위로 이동할 때, 이 커브 값도 블렌드에 의해 1에서 2로 변화한다.
그래서 블루프린트는 이렇게 쓸 수 있다.
커브 값이 1에서 2로 변하므로, 여기서 1을 빼서 0에서 1로 변하는 값으로 바꾼다. 이 0~1 범위의 커브 값이 걷기 보폭 커브와 달리기 보폭 커브의 블렌드 정도를 결정할 수 있다.

【블렌드 스페이스 기초에 대한 여담】어떤 독자는 이렇게 의문을 가질 수도 있다. “내가 달리기 키를 누르면 보행 상태가 바로 Gait == Run으로 바뀌는 것 아닌가? 그러면 내가 넘겨주는 Walk/Run 값은 1이어야 하는데, 어떻게 중간 상태가 생기지?” 답은, 블렌드 스페이스 안의 이 녹색 애니메이션 포인터는 가로축과 세로축 값이 바뀔 때 점프하듯 바로 이동하는 것이 아니라, 보간되어 이동한다는 것이다. 왼쪽 패널에서 가로축과 세로축의 보간 시간, 보간 방식을 모두 설정할 수 있다. 그래서 실제로 걷기/달리기 전환 시에는 “중간 상태”가 존재한다.
2.3 보행 빈도
보행 빈도의 계산 방식은 아주 간단하다. 캐릭터의 현재 속도를, 현재 대응하는 보행 상태의 최고 속도로 나누면 된다.
즉, CurrentSpeed / CurrentMaxSpeed다.
자연스럽게도 보행 빈도 계산 역시 보폭에서와 비슷한 문제를 만난다. 걷기/달리기 보행 상태가 전환되는 과정에서, 보행 빈도도 블렌드 스페이스의 걷기/달리기 보행 상태 블렌드처럼 함께 블렌드되어야 한다.
해결 방법도 커브를 사용하는 것이다. 여기서는 커브에서 값을 얻고 0~1로 매핑하는 부분을 매크로로 만들어두었으므로, 자세히 설명하지 않겠다.

앞부분은 걷기/달리기 블렌드 정도를 결정하는 데 사용하고, 뒷부분은 달리기와 전력 질주의 블렌드 정도를 결정하는 데 사용한다.
여기까지 하면, 우리는 최초의 생각보다 조금 더 자연스러워 보이는 걷기/달리기 블렌드 애니메이션을 일단 만들 수 있다.

맺음말
이 글은 필자가 @五谷延年 선배가 B站(그리고 冲呀 플랫폼)에 올린 고급 로코모션 시스템 튜토리얼을 공부하는 과정에서, 튜토리얼에 약간 부족한 점이 있다고 느낀 데서 출발했다. 예를 들어 36강의 걷기/달리기 블렌드 부분에서는, 이 노드들을 왜 이렇게 구성하는지에 대한 이념을 충분히 설명하지 못했고, 그래서 필자가 공부할 때 적지 않은 혼란이 있었다.
물론 필자는 튜토리얼을 모든 면에서 빠짐없이 만들려면 마음도 힘도 많이 들 뿐 아니라 현실적으로 어렵다는 것을 잘 알고 있다. 필자는 五谷延年 선배가 UE 커뮤니티에 사심 없이 기여한 이 튜토리얼에 매우 감사하고 있으며, 무슨 불평을 하려는 것도 아니다. 그래서 이 글을 썼다. 어디까지나 五谷延年 선배 튜토리얼에 대한 아주 작은 보충이라고 보면 된다.
여기까지 본 독자는 가능하다면 손 가는 김에 좋아요와 즐겨찾기(그리고 가능하면 좋아요 버튼도 하나 더)를 눌러주면 좋겠다. 이건 나에게 정말 중요하다 = =! 앞으로도 골격 애니메이션 관련 튜토리얼과 생각 공유가 더 있을 예정이니, 팔로우해두면 업데이트를 놓치지 않을 수 있다.

마지막으로 골격 애니메이션에 관심 있는 독자라면, B站에서 五谷延年 선배의 무료 튜토리얼도 꼭 한번 공부해보기를 매우 환영한다.
36 고급 로코모션 시스템 해체 - 이동 보폭과 걷기/달리기 블렌드_哔哩哔哩_bilibili

PS: 덧붙여 여기서 필자가 막 만든 UE 골격 애니메이션 교류방을 살짝 광고한다. 916274600 각위 대佬들의 매서운 지적을 환영합니다.

목차: UE4 UE5 골격 애니메이션 고급 로코모션 시스템(ALSV4) - 知乎 (zhihu.com)
다음 글: UE4 UE5 골격 애니메이션 고급 로코모션 시스템: 8방향 이동 - 知乎 (zhihu.com)
“사람이 꽤 많네”




타카기, 나한테 먹여줘! (간청)

타카기, 나한테 먹여줘! (간청)
원문
(77 封私信 / 85 条消息) UE4/UE5 骨骼动画 高级运动系统 走跑混合初步 - 知乎
'TECH.ART.FLOW.IO' 카테고리의 다른 글
| [번역] UE4 UE5 골격 애니메이션 고급 로코모션 시스템: 8방향 이동 (0) | 2026.07.22 |
|---|---|
| [INDEX] ANIMATION SYSTEM (0) | 2026.07.21 |
| [번역] UE4 UE5 골격 애니메이션 고급 로코모션 시스템 (ALSV4) (1) | 2026.07.21 |
| Systemic Shader Reduction: How We Cut Fortnite’s Shaders by 68% | Unreal Fest Chicago 2026 (0) | 2026.07.21 |
| A Deep Dive Intro Lore Version Control (0) | 2026.07.21 |