UE5 Motion Matching 1편 :: 모든 캐릭터가 이동 시스템을 공유하는 구조
Unreal Engine 5.7 | Motion Matching | Pose Search | Chooser Table | AnimInstance 아키텍처캐릭터가 셋인데 이동 시스템은 하나여야 한다검사, 방패병, 궁수. 이 세 캐릭터는 무기도 다르고, 전투 스타일도 다르다.
raindrovvv.tistory.com
UE5 Motion Matching 2편 :: Offset Root Bone, Warping, IK, Aim Offset
Motion Matching이 모션을 골랐다. 그 다음은?2026.03.11 - [Dev./UE 언리얼 엔진] - UE5 Motion Matching 1편 :: 모든 캐릭터가 이동 시스템을 공유하는 구조 UE5 Motion Matching 1편 :: 모든 캐릭터가 이동 시스템을 공
raindrovvv.tistory.com
UE5 Motion Matching 3편 :: 전투 애니메이션... 그리고 GAS 연동
지금 프로젝트에서 전투는 어디에서 결정되는가 UE5 Motion Matching 1편 :: 모든 캐릭터가 이동 시스템을 공유하는 구조Unreal Engine 5.7 | Motion Matching | Pose Search | Chooser Table | AnimInstance 아키텍처캐릭터
raindrovvv.tistory.com
UE5 Motion Matching 4편 :: Strafe 전환에서 만난 문제들과 해결 과정
UE5 Motion Matching 1편 :: 모든 캐릭터가 이동 시스템을 공유하는 구조Unreal Engine 5.7 | Motion Matching | Pose Search | Chooser Table | AnimInstance 아키텍처캐릭터가 셋인데 이동 시스템은 하나여야 한다검사, 방패
raindrovvv.tistory.com
1~4편에서 아키텍처, Locomotion 세팅, GAS 연동 전투 애니메이션, 트러블슈팅까지 다루었다.
이 글은 시리즈의 마지막 편으로, 이 시스템(GASP)을 다른 UE5 프로젝트에 재현하는 실용 가이드다.
모든 절차의 출발점은 Skeleton 호환성 확인이다. 이 결과에 따라 작업량이 극적으로 달라진다.
호환되면 ABP 하나로 모든 캐릭터가 동작하고, 호환되지 않으면...
캐릭터마다 ABP와 Motion Matching DB를 별도로 만들어야 한다.
0단계: Skeleton 호환성 확인 (반드시 먼저)
UE5에서 "외형이 다르다"와 "Skeleton이 다르다"는 별개다.
갑옷이 다르고 체형이 달라도, 안에 있는 뼈대(본 이름과 계층)가 같으면 하나의 ABP를 공유할 수 있다.
확인 방법
방법 1 — ABP Preview Mesh 교체 (가장 빠름): ABP_Seeker를 열고, Preview Scene Settings에서 Preview Mesh를 다른 캐릭터 Mesh로 바꿔본다. 정상 재생되면 호환, T-Pose가 나오면 비호환이다.
방법 2 — Skeleton 에셋 직접 비교: 각 캐릭터의 Skeletal Mesh를 열어 Details 패널의 Skeleton 항목을 확인한다. 같은 Skeleton 에셋을 참조하면 호환이다.
방법 3 — Skeleton Tree 비교 (가장 정확): 두 Skeleton 에셋을 각각 열어 루트부터 주요 본의 이름과 계층이 동일한지 비교한다.


판단 결과에 따른 전략
| 결과 | 전략 | 작업량 |
|---|---|---|
| 같은 Skeleton 에셋 참조 | 전략 A — ABP 1개 공유 | 최소 |
| 다른 Skeleton이지만 본 구조 동일 | 전략 A — Compatible Skeleton 설정 후 공유 | 소 |
| 본 구조 자체가 다름 | 전략 B — 캐릭터별 ABP + IK Retarget | 대 |
특수 케이스: 남성/여성 Skeleton이 별도인 경우
파일은 다르지만 본 구조가 동일할 수 있다.
먼저 Compatible Skeleton 설정을 시도하고, 체형 차이로 꺾임이 심하면 IK Retargeter로 분리한다.

전략 A: Skeleton 호환 — ABP 1개 공유
가장 이상적인 경우다.
ABP_Seeker (1개) ← 모든 캐릭터 공유
├── Ares: SKM_Ares (Mesh만 다름)
├── Chan: SKM_Chan (Mesh만 다름)
└── Merci: SKM_Merci (Mesh만 다름)
Compatible Skeleton 설정 (SK 파일이 다른 경우)
SK_Ares더블클릭 → Asset → Set Compatible SkeletonsSK_Merci추가- 반대 방향도 동일하게 설정
없는 본(무기 소켓 등)은 무시되므로 locomotion에는 영향 없다.
전략 B: Skeleton 비호환 — 캐릭터별 ABP + 로직 공유
구조
C++ (공유) Blueprint ABP (캐릭터별)
UGS_SeekerAnimInstance
├─→ ABP_Ares ← SK_Ares 기반
├─→ ABP_Chan ← SK_Chan 기반
└─→ ABP_Merci ← SK_Merci 기반
C++ AnimInstance가 locomotion 로직 전체를 처리하므로, 각 ABP는 AnimGraph 구조만 동일하게 유지하면 된다.
IK Retargeter 세팅




- 원본/대상 각각의 IK Rig 에셋 생성 → 본 체인 정의
- IK Retargeter 에셋 생성 → 본 체인 매핑
- 기존 애니메이션을 일괄 리타겟 → 대상 Skeleton 기반 모션 생성
- 리타겟된 모션으로 Pose Search DB 구성
- Chooser Table에서
CharacterType분기로 대상 DB 연결
Chooser Table 세팅
전략 A, B 모두 동일하게 적용된다. Chooser Table은 조건에 따라 Motion Matching DB를 자동 선택하는 데이터 에셋이다.
캐릭터 타입 분기 추가 (필요한 경우만)
Skeleton이 호환되고 locomotion이 동일하면 분기가 필요 없다. 캐릭터별로 실제로 다른 애니메이션 셋이 있을 때만 추가한다.
- Chooser Table 열기 → Add Column
- Object 타입
GS_ChooserInputObj→ 프로퍼티CharacterType선택 - 행에 조건 추가 (예:
CharacterType == Ares) → 해당 DB 연결

ChooserInputObj에 CharacterType 설정
void UGS_SeekerAnimInstance::NativeInitializeAnimation()
{
Super::NativeInitializeAnimation();
if (ChooserInputObject && SeekerCharacter)
ChooserInputObject->CharacterType = SeekerCharacter->GetChooserCharacterType();
}
Overlay System으로 캐릭터별 무기/자세 분리
locomotion은 공유하면서 캐릭터별 무기 자세(검, 방패, 활)를 분리하는 핵심 시스템이다.
현재 프로젝트에는 Bow(활) 오버레이 자산이 존재하므로, 이 패턴을 기준으로 다른 무기 오버레이를 확장하는 접근이 유효하다.
새 오버레이 만들기 (예: Sword for Ares)
1. 포즈 애니메이션 준비: Content/OverlaySystem/Sword/에 Idle, Walk, Run 상체 포즈 배치
2. 오버레이 ABP 생성: Parent Class AnimInstance, Target Skeleton 해당 캐릭터, ALI_OverlayBase와 ALI_OverlayPose 인터페이스 구현
3. Chooser Table 등록: CHT_OverlayBases에 새 행 추가, 조건과 결과 연결
4. 캐릭터 BP에서 링크: 캐릭터 BP 또는 초기화 경로에서 LinkAnimClassLayers를 연결한다.
if (USkeletalMeshComponent* MeshComp = GetMesh())
{
MeshComp->LinkAnimClassLayers(ABP_Overlay_Sword_Class);
}

캐릭터 블루프린트 구성
핵심 원칙
- 부모 클래스는 항상 우리 캐릭터 클래스(
AGS_Ares,AGS_Chan,AGS_Merci) - GASP의
SandboxCharacter_*BP를 복제해서 재부모 변경하지 않는다 - GASP BP는 구조 참고용, 우리 캐릭터 BP를 기준으로 GASP 요소를 이식
캐릭터별 구성
BP_Ares / BP_Chan / BP_Merci
├── Parent Class: AGS_Ares / AGS_Chan / AGS_Merci
├── Skeletal Mesh: 캐릭터 전용
├── Anim Class:
│ ├── 전략 A → ABP_Seeker (공유)
│ └── 전략 B → ABP_Ares / ABP_Chan / ABP_Merci (개별)
├── Overlay: BeginPlay에서 LinkAnimClassLayers
└── FootManagerComponent: foot_l_Socket, foot_r_Socket
작업 순서
- BP 생성 (부모 클래스 설정)
- Mesh 연결 + Skeleton 확인
- Anim Class 연결
- 기본 이동 테스트 (Idle/Move/Jump)
- 필요 시 Overlay, Chooser 세분화, DB 분리
요약
| 항목 | 전략 A (SK 호환) | 전략 B (SK 비호환) |
|---|---|---|
| Skeleton | 1개 (Compatible 설정) | 캐릭터별 각 1개 |
| ABP | ABP_Seeker 1개 공유 |
캐릭터별 ABP |
| MM Database | 1세트 공유 | 캐릭터별 리타겟 DB |
| Chooser Table | 공유 (CharacterType 분기 불필요) | 공유 (CharacterType 분기 필요) |
| Overlay ABP | 캐릭터별 생성 | 캐릭터별 생성 |
| Montage | 캐릭터별 생성 | 캐릭터별 생성 |
| AnimInstance C++ | GS_SeekerAnimInstance 1개 |
GS_SeekerAnimInstance 1개 |
이 시리즈 전체를 관통하는 핵심은 결국 하나다. Motion Matching 자체는 잘 동작한다. 문제는 항상 Motion Matching에 도달하기 전의 입력에서 발생한다.
Trajectory가 올바른 facing을 받지 못하면 엉뚱한 클립이 선택된다.
Offset Root Bone의 모드가 상태에 맞지 않으면 드리프트가 발생한다. bUseControllerRotationYaw가 잘못 고정되면 Aim Offset이 죽는다. 조준, 드로우, 빈사, gait 같은 상태 값이 Anim/MM 입력과 어긋나면 전투 중 전환도 쉽게 흔들린다.
이 시스템을 재현할 때 가장 먼저 해야 할 일은 Skeleton 호환성 확인이고, 가장 마지막까지 신경 써야 할 일은 "각 값이 올바른 타이밍에, 올바른 좌표계에서, 올바른 책임자에 의해 갱신되고 있는가"를 확인하는 것이다...!
'Dev. > UE 언리얼 엔진' 카테고리의 다른 글
| UE5 이동속도 동기화와 모션매칭 안정화 트러블슈팅 (0) | 2026.03.25 |
|---|---|
| AI와 함께 Unreal Engine 플러그인을 만드는 워크플로우 — 삽질을 시스템으로 바꾸는 법 (0) | 2026.03.19 |
| UE5 Motion Matching 4편 :: Strafe 전환에서 만난 문제들과 해결 과정 (0) | 2026.03.15 |
| UE5 Motion Matching 3편 :: 전투 애니메이션... 그리고 GAS 연동 (0) | 2026.03.14 |
| UE5 Motion Matching 2편 :: Offset Root Bone, Warping, IK, Aim Offset (1) | 2026.03.13 |
