해결 과정 1: 시퀀서를 이용한 제자리 애니메이션 굽기 (Bake)
외부 애니메이션의 전진 데이터를 삭제하고 완벽한 제자리(In-Place) 애니메이션으로 수정했다.
- 원본 애니메이션을 레벨 시퀀스(Level Sequence) 에 올림.
- 트랙 우클릭 ->
Bake To Control Rig->FK Control Rig생성. - 캐릭터 골반(
Hips) 뼈의Transform->Location트랙 확인. - 캐릭터가 전진하는 방향의 축(이번 케이스의 경우
Z축 및 불필요한X축)을 Delete 키로 삭제. (위아래 높낮이를 담당하는 축만 남겨둠). - 수정된 트랙을 우클릭하여
Bake Animation Sequence로 새로운 애니메이션(Anim_Slide_InPlace) 생성.
해결 과정 2: AnimGraph를 활용한 스케일 복구 및 위치 보정
슬라이딩 시 충돌 판정(Capsule Component)의 크기를 줄이지 않기로 결정했다. 대신, 시각적인 메쉬(Mesh)만 바닥으로 내리기 위해 애니메이션 블루프린트(ABP)를 수정했다.
- 노드 추가:
Slide상태(State) 내부에Transform (Modify) Bone노드 추가 (대상 본:Hips). - Z축 오프셋 적용:
Translation->Add to Existing(Component Space)Z값을-40.0으로 설정하여 캡슐 변경 없이 캐릭터 몸체만 바닥으로 밀착시킴.
- 스케일 축소 버그 해결: Mixamo 원본 애니메이션에 포함된 Scale 축소 데이터(0.66)를 무시하기 위해 설정 변경.
Scale->Replace Existing(Component Space)- X, Y, Z 값을 모두
1.0으로 덮어씌워 강제로 정상 크기 유지.
해결 과정 3: Tick 보간과 중력 충돌에 의한 Jittering 해결
가장 큰 문제였던 ‘카메라 덜덜거림’은 C++ 코드의 Tick 로직과 물리 엔진(Movement Component) 간의 Z축 주도권 충돌이 원인이었다.
원인 분석
서버의 Tick 함수 내부 VInterpTo 로직에서 액터의 X, Y, Z 모든 축을 보간하여 강제로 위치를 세팅하고 있었다[cite: 2]. 캐릭터를 강제로 위로 올린 상태에서 이 로직이 돌게 되면:
CharacterMovement는 공중(Falling)으로 판단하여 매 프레임 중력(아래)을 적용.Tick의SetActorLocation은 고정된 Z 목표값을 향해 위로 액터를 끌어올림[cite: 2].- 두 시스템이 매 프레임 충돌하며 캡슐이 위아래로 진동하고, 캡슐에 붙은 SpringArm과 카메라가 심하게 떨리게 됨[cite: 2].
This post is licensed under CC BY 4.0 by the author.