블렌드 스페이스 기본 사용법
1D·2D 블렌드 스페이스의 축과 샘플을 설정하고 속도·방향 값으로 이동 애니메이션을 자연스럽게 섞습니다.
스테이트 머신은 대기에서 이동으로, 이동에서 점프로 상태가 바뀌는 순간을 다루기에 좋습니다. 하지만 이동 속도처럼 0에서 600까지 끊임없이 변하는 값마다 상태를 새로 만들 수는 없습니다. 천천히 걷는 속도, 빠르게 걷는 속도, 뛰기 직전의 속도를 모두 따로 만들면 상태와 전환이 끝없이 늘어나기 때문입니다. 이처럼 연속적으로 변하는 값에 따라 여러 애니메이션을 부드럽게 섞어야 할 때 쓰는 것이 블렌드 스페이스(Blend Space)입니다.
이 글에서는 블렌드 스페이스가 무엇이고 1D와 2D가 어떻게 다른지 살펴본 뒤, 앞 글의 Walk_Run 상태가 쓰는 BS_WalkRun을 만들어 축과 샘플을 설정합니다. 그리고 애님 블루프린트에 연결한 뒤 입력값이 축 위의 어디를 가리키는지 계산하고, 실제 동작을 디버깅하는 방법까지 확인합니다.
축 위의 샘플 사이를 섞는 에셋
블렌드 스페이스는 한 축 또는 두 축의 공간에 여러 애니메이션 시퀀스를 배치하고, 입력값에 따라 그 사이를 보간(interpolation)해 연속적인 애니메이션을 만드는 에셋입니다. 캐릭터의 이동 속도, 방향, 자세 같은 값을 넣으면 그 값에 맞는 애니메이션을 알아서 섞어 줍니다.
블렌드 스페이스를 쓰면 멈춰 있다가 천천히 걷고, 빠르게 달리다가 전력 질주하는 과정처럼 연속적으로 바뀌는 움직임을 부드럽게 표현할 수 있습니다. 모든 중간 속도의 애니메이션을 따로 만들 필요 없이 핵심 애니메이션 몇 개만 축에 놓으면 그 사이의 포즈가 만들어지므로, 필요한 애니메이션 에셋의 수도 줄어듭니다. 또 블렌드 스페이스 에디터에서 샘플을 놓은 위치와 섞인 결과를 바로 미리 볼 수 있어 조정하기도 편합니다.
블렌드 스페이스는 입력 축의 수에 따라 두 종류로 나뉩니다. 블렌드 스페이스 1D(Blend Space 1D)는 속도처럼 입력값 하나로 애니메이션을 섞으며, 멈춤에서 걷기, 달리기로 한 방향으로 변하는 움직임에 주로 씁니다. 그냥 블렌드 스페이스(Blend Space)라고 부르는 2D 에셋은 속도와 방향처럼 입력값 두 개로 섞으므로, 앞뒤와 좌우 이동을 함께 다뤄야 할 때 씁니다. 그래서 에셋을 만들기 전에 어떤 값으로 움직임을 섞을지부터 정해야 합니다.
이 글의 기본 실습은 Idle, Walk, Run을 속도 하나로 섞는 Blend Space 1D로 만듭니다. 방향별 애니메이션이 있을 때 2D 축을 더하는 방법도 함께 설명합니다.
BS_WalkRun 만들기
앞 글 스테이트 머신의 기본 활용의 안내를 따라 왔다면 이 절의 생성과 설정을 마치고 에셋을 저장한 뒤, 앞 글의 애님 블루프린트 설정으로 돌아가 Speed 변수와 상태를 연결하면 됩니다. 같은 스켈레톤으로 BS_WalkRun을 이미 만들었다면 새로 만들 필요는 없고, 아래의 축과 샘플 배치만 확인한 뒤 애님 블루프린트 연결로 넘어갑니다. 필요한 애니메이션은 가만히 서 있는 Idle, 걷는 Walk, 달리는 Run 세 가지입니다.
콘텐츠 브라우저의 Add(+) 버튼을 누르거나 빈 곳을 우클릭한 뒤, Animation 메뉴에서 Blend Space 1D를 고릅니다. 방향 샘플까지 쓸 계획이라면 Blend Space를 고릅니다. 공식 문서에 따르면 5.8의 Animation 메뉴에는 Aim Offset, Aim Offset 1D, Blend Space, Blend Space 1D 네 종류가 있습니다. 이어서 블렌드 스페이스를 적용할 캐릭터의 스켈레톤을 선택하고, 에셋 이름을 BS_WalkRun으로 정합니다.
축 설정하기
BS_WalkRun을 더블클릭하면 블렌드 스페이스 에디터가 열립니다. 에디터는 샘플을 놓는 그리드 작업 공간과 애니메이션 미리보기 화면으로 이루어져 있습니다. Asset Details 패널의 Axis Settings 항목에서 가로축(Horizontal Axis)을 다음과 같이 설정합니다.
| 항목 | 값 | 뜻 |
|---|---|---|
Name | Speed | 블렌드 그래프와 플레이어 노드에 표시되는 축 이름 |
Minimum Axis Value | 0.0 | 멈춰 있는 상태 |
Maximum Axis Value | 600.0 | 최대 달리기 속도. 실제 게임의 속도에 맞게 조절 |
Grid Divisions | 6 | 축을 나누는 칸의 수 |
Grid Divisions는 축을 나누는 편집용 칸의 수일 뿐입니다. 공식 문서에 따르면 Use Grid를 켜지 않은 경우 이 값은 그리드가 보이는 모양만 바꾸며, 칸을 늘린다고 샘플이나 애니메이션의 품질이 저절로 늘지는 않습니다.
2D 에셋으로 넓힐 때는 세로축(Vertical Axis)도 설정합니다. Name을 Direction으로 두고, Minimum Axis Value는 -180.0, Maximum Axis Value는 180.0, Grid Divisions는 4로 둡니다. 이 축에서 전진은 0도, 좌우는 약 ±90도이고, -180도와 180도는 부호만 다르게 표시한 같은 뒤쪽 방향입니다.
샘플 배치하고 미리 보기
에디터의 에셋 브라우저(Asset Browser)에서 Idle, Walk, Run 애니메이션 시퀀스를 찾아 그리드로 끌어다 놓습니다. Idle은 Speed 0.0인 가장 왼쪽에, Walk는 약 200.0 지점에, Run은 최댓값인 600.0 지점에 둡니다. 공식 문서에 따르면 끌어다 놓을 때 Shift 키를 누르고 있으면 샘플이 그리드 지점에 맞춰집니다.
2D 에셋이라면 이 세 샘플을 Direction 0, 즉 전진 위치에 두고, 후진과 좌우 이동 애니메이션을 각 방향의 각도에 추가합니다. 전진 애니메이션 세 개만으로는 뒤로 걷거나 옆으로 걷는(스트레이프) 동작이 만들어지지 않습니다.
샘플을 놓았으면 Ctrl 키를 누른 채 그리드 위에서 마우스를 움직여 봅니다. 공식 문서에 따르면 커서 위치가 초록색 십자 표시로 나타나고, 그 지점의 입력값으로 섞인 결과가 미리보기에 재생됩니다. 커서를 왼쪽에서 오른쪽으로 옮기면 Idle, Walk, Run이 차례로 섞이며 캐릭터의 움직임이 부드럽게 바뀌는지 확인한 뒤 에셋을 저장합니다.
입력값이 가리키는 위치 계산하기
블렌드 스페이스가 입력값을 어떻게 해석하는지 그림으로 보겠습니다.
BLEND SPACE 1D · CONTINUOUS INPUT
Speed 입력은 축 위 샘플 사이의 위치를 선택합니다
이 실습은 Idle을 0, Walk를 200, Run을 600에 둡니다. Speed 400은 Walk–Run 구간 안에 있으며, 그 사이의 포즈를 보간합니다. 축의 실제 값 간격을 유지한 개념도입니다.
상태 전환과 연속 보간
새 상태를 매번 만드는 대신 현재 Blend Space Player가 축 입력에 맞춰 포즈를 섞습니다. 실제 혼합 비율과 반응은 필터·보간 설정을 함께 확인합니다.
2D 확장에는 방향 샘플도 필요합니다
Direction 축을 추가했다면 후진·좌우 애니메이션을 해당 각도에 배치합니다. 전진 Idle·Walk·Run 세 클립만으로 스트레이프가 만들어지지는 않습니다.
Grid Divisions는 축의 편집 분할입니다. 분할 수를 늘리는 것만으로 샘플이나 애니메이션 품질이 늘지 않습니다.
위 그림은 이 실습의 Speed 축을 실제 값의 간격 그대로 그린 개념도입니다. Idle은 0, Walk는 200, Run은 600에 있어서, 0에서 200까지의 간격은 200에서 600까지 간격의 절반입니다. 점선으로 표시한 Speed 400은 Walk와 Run 구간의 한가운데를 가리키며, 블렌드 스페이스는 그 사이의 포즈를 보간합니다. 이 점선은 입력이 가리키는 위치이지 시간의 흐름이 아닙니다.
그림의 나머지 설명도 같은 생각을 이어 갑니다. 속도가 바뀔 때마다 새 상태를 만드는 대신, 하나의 블렌드 스페이스 플레이어가 축 입력에 맞춰 포즈를 섞습니다. 2D로 넓혀 Direction 축을 더했다면 후진과 좌우 애니메이션을 해당 각도에 따로 놓아야 하고, Grid Divisions는 편집용 분할이라 그 수를 늘려도 샘플이 생기지 않습니다.
이제 숫자로 따져 보겠습니다. 이 예제의 Speed 600은 cm/s 단위의 이동값과 연결하면 초속 6m입니다. 축 위의 0, 200, 600은 시간 순서가 아니라 속도의 위치이므로, 입력이 400이면 Walk(200)와 Run(600) 사이에서 (400 − 200) / (600 − 200) = 0.5 위치에 있습니다. 입력과 가중치를 시간에 따라 보정하지 않고 이웃한 두 샘플을 선형으로 보간하는 단순한 조건이라면 Walk와 Run이 각각 0.5씩 섞입니다.
다만 실제 재생에서는 다른 설정도 결과에 영향을 줍니다. 공식 문서에 따르면 Smoothing Time은 축의 입력이 바뀔 때 몇 초에 걸쳐 따라갈지를 정하고, Weight Speed는 각 샘플의 가중치가 얼마나 빨리 바뀔 수 있는지를 정합니다. 그래서 화면에서 확인하는 실제 가중치가 언제나 이 계산과 같다고 단정하지는 않습니다. 공식 문서는 Weight Speed와 Smoothing Time을 함께 쓰지 말라고도 권합니다.
애님 블루프린트에 연결하기
이제 앞 글에서 만든 애님 블루프린트의 스테이트 머신에 BS_WalkRun을 연결합니다. 이미 연결했다면 아래 순서대로 에셋과 입력, 포즈 출력이 맞는지만 확인하면 됩니다.
먼저 애님 블루프린트(예: ABP_Mannequin)를 열고 이벤트 그래프를 확인합니다. 앞 글에서 만든 Event Blueprint Update Animation 로직이 캐릭터의 수평 속도를 Float 타입의 Speed 변수에 저장하고 있어야 하며, 이 변수가 BS_WalkRun의 Speed 축 입력으로 쓰입니다.
2D 에셋으로 Direction 축을 쓴다면 방향 값도 계산해야 합니다. Calculate Direction 노드의 Velocity에 캐릭터의 속도를, Base Rotation에 액터의 회전(Get Actor Rotation)을 넣으면 -180도에서 180도 사이의 결과가 나오며, 이 값을 Direction 변수에 저장합니다. 오른쪽 방향 벡터와 속도의 내적만으로는 이 각도 범위를 얻을 수 없으므로 이 노드를 쓰는 편이 안전합니다.
다음으로 애님 그래프 탭에서 Default State Machine을 더블클릭해 들어가고, Walk_Run 상태를 더블클릭해 내부 그래프를 엽니다. 앞 글에서 연결한 BS_WalkRun 플레이어가 있다면 그대로 쓰고, 없다면 BS_WalkRun 에셋을 상태 그래프로 끌어다 놓아 플레이어 노드를 만듭니다. 블렌드 스페이스 플레이어에는 축 이름과 같은 Speed 입력 핀이 나타나고, 2D 에셋이라면 Direction 핀도 함께 나타납니다. Speed 핀에는 Speed 변수를, Direction 핀에는 따로 계산한 Direction 변수를 연결하고, 플레이어의 포즈 출력을 Output Animation Pose에 연결한 뒤 컴파일하고 저장합니다.
블렌드 스페이스 확인과 디버깅
블렌드 스페이스가 어색하게 보일 때는 애니메이션 자체보다 축 값, 샘플 배치, 보간 설정부터 점검하는 편이 빠릅니다. 먼저 게임을 플레이하고 캐릭터를 움직여, 멈췄을 때와 걸을 때, 달릴 때의 동작이 자연스럽게 이어지는지 봅니다.
동작이 기대와 다르면 애님 블루프린트 에디터를 열어 둔 채 다시 플레이합니다. 툴바의 디버그 오브젝트(Debug Object) 드롭다운에서 플레이 중인 캐릭터의 인스턴스를 고르면, 애님 그래프와 스테이트 머신에서 지금 활성인 상태와 포즈 연결이 실시간으로 표시됩니다. Speed 같은 핀의 값을 계속 보고 싶다면 그 핀의 이름을 우클릭해 Watch this value를 고릅니다. 특정 노드가 만든 포즈를 직접 보고 싶다면 노드를 우클릭해 Toggle Pose Watch를 켜면, 그 노드의 포즈가 미리보기 화면에 디버그 그림으로 표시됩니다.
이렇게 보면 문제가 어디에 있는지 나눌 수 있습니다. Speed 값 자체가 이상하다면 이벤트 그래프의 계산을, 값은 맞는데 섞인 동작이 이상하다면 샘플의 위치와 Smoothing Time 같은 보간 설정을, Walk_Run 상태로 아예 들어가지 않는다면 앞 글의 전환 규칙을 확인합니다.
블렌드 스페이스는 Idle, Walk, Run뿐 아니라 웅크린 자세의 이동이나 조준하며 이동하는 동작처럼 여러 값이 함께 바뀌는 움직임에도 쓸 수 있습니다.
정리
- 블렌드 스페이스는 축 위에 놓은 애니메이션 샘플 사이를 입력값으로 보간해 연속적인 움직임을 만드는 에셋입니다.
- Blend Space 1D는 입력값 하나로, Blend Space는 두 입력값으로 섞으며, 2D 방향 이동에는 방향별 샘플이 따로 필요합니다.
- 이 실습은
Speed축 0~600에Idle0,Walk200,Run600을 둡니다.Grid Divisions는 편집용 분할이라 늘려도 샘플이 생기지 않습니다. - 입력값의 위치는 이웃한 두 샘플 사이의 비율로 계산할 수 있지만, 실제 가중치에는
Smoothing Time과Weight Speed같은 설정도 영향을 줍니다. - 플레이 중에는 디버그 오브젝트를 캐릭터로 고르고, 핀 값은 Watch로, 노드의 포즈는 Pose Watch로 확인합니다.
연습 문제
1. 새 입력 위치 계산하기
세 샘플을 그대로 둔 채 Speed가 300이 됐습니다. 어느 두 샘플 사이에 있으며, 그 구간에서 Run 쪽으로 이동한 비율은 얼마일까요? 또 Grid Divisions만 6에서 12로 바꾸면 Run 샘플이 하나 더 생길까요?
해설 보기
300은 Walk(200)와 Run(600) 사이에 있고, 그 구간에서 Run 쪽으로 (300 − 200) / (600 − 200) = 0.25만큼 이동한 위치입니다. 앞에서와 같은 단순한 선형 보간 조건이라면 Walk가 0.75, Run이 0.25로 섞입니다. 화면에서 확인하는 실제 가중치는 보간 설정의 영향을 받을 수 있으므로 이 계산과 구별합니다.
분할 수만 바꿔서는 애니메이션 샘플이 추가되지 않습니다. Use Grid를 끈 상태에서 Grid Divisions는 편집 화면의 구분일 뿐이므로, 그 숫자를 늘리는 것만으로 새 동작이 만들어지지 않습니다.
2. 전진 클립만 넣은 2D 블렌드 스페이스
2D 블렌드 스페이스를 만들고 Idle, Walk, Run을 Direction 0에만 배치했습니다. 캐릭터가 왼쪽으로 걸어 Direction이 -90이 되면 옆으로 걷는 동작이 재생될까요?
해설 보기
재생되지 않습니다. 블렌드 스페이스는 이미 놓인 샘플 사이를 섞을 뿐이므로, -90도 근처에 놓인 샘플이 없으면 옆으로 걷는 포즈를 만들어 낼 수 없습니다. 화면에는 전진 샘플에서 나온 동작이 재생되므로, 몸은 앞으로 걷는데 실제로는 옆으로 미끄러지는 것처럼 보이기 쉽습니다.
옆으로 걷는 동작이 필요하면 왼쪽과 오른쪽 이동 애니메이션을 -90도와 90도에, 후진 애니메이션을 -180도와 180도에 추가합니다.
3. 축의 최댓값과 실제 최고 속도
축의 최댓값과 Run 샘플은 600에 있는데, 캐릭터의 Character Movement 컴포넌트에서 Max Walk Speed를 300으로 바꿨습니다. 캐릭터가 최고 속도로 움직일 때 Run 애니메이션이 온전히 재생될까요?
해설 보기
온전히 재생되지 않습니다. 최고 속도에서도 Speed는 300이므로, 1번 문제처럼 Walk 0.75와 Run 0.25가 섞인 동작에서 멈춥니다. 축은 600까지 있지만 입력이 그 위치에 닿지 못하기 때문입니다.
Run을 온전히 보여 주려면 Run 샘플과 축의 최댓값을 실제 최고 속도인 300 근처로 옮기거나, 캐릭터의 최고 속도를 축에 맞춥니다. 축의 범위와 샘플 위치는 언제나 게임에서 실제로 나오는 입력값을 기준으로 정합니다.
블렌드 스페이스의 축 설정과 미리보기 방법은 언리얼 엔진 공식 문서의 블렌드 스페이스에서 확인할 수 있습니다.
다음 글 애님 몽타주와 노티파이의 기초에서는 공격처럼 한 번 재생하고 끝나는 동작을 몽타주로 구성하고, 노티파이로 타격 시점의 게임 로직을 호출합니다.