영상을 불러오지 못했습니다

Root Motion 중 이동 리플리케이션이 멈춘 것처럼 보일 때

699 단어
3 분
Root Motion 중 이동 리플리케이션이 멈춘 것처럼 보일 때

Root Motion Montage 재생 중 다른 client에서 character 위치가 갱신되지 않거나 montage가 끝난 뒤 갑자기 보정되는 현상이 있었다.

문제 현상#

server와 owning client에서는 이동이 자연스러웠다. 하지만 simulated proxy에서는 일반 actor transform replication이 멈춘 듯 보였다. ACharacter::OnRep_ReplicatedMovement를 따라가면 networked root motion montage가 활성화된 동안 일반 보정과 다른 경로를 사용한다는 사실이 확인된다.

적용 범위#

ACharacter, CharacterMovementComponent, animation montage의 Root Motion을 network play에서 쓰는 프로젝트에 해당한다. custom movement나 Gameplay Ability System이 별도 prediction을 제공한다면 해당 계층도 함께 살펴본다.

원인#

Unreal의 networked Root Motion Montage는 server transform만 단순히 복제하지 않는다. montage 위치, root motion source와 server correction을 결합해 proxy를 갱신한다. montage trigger나 position이 올바르게 전달되지 않으면 proxy는 root motion 전용 경로에 들어가도 적용할 animation 상태가 부족하다. 이때 보정이 멈춘 것처럼 보인다.

재현 및 진단#

  1. server, autonomous proxy, simulated proxy에서 LocalRole, montage 이름과 position을 기록한다.
  2. IsPlayingNetworkedRootMotionMontage, RepRootMotion과 movement mode를 서로 비교한다.
  3. montage 시작 RPC가 server 권한을 거쳐 관련 client에 전달되는지 확인한다.
  4. AnimInstance의 Root Motion Mode가 역할별로 예상한 값인지도 살핀다.
  5. packet loss와 latency 조건에서 montage 시작·중단·blend out을 반복한다.

해결 방법#

일반적인 구성에서는 server가 montage 시작을 권한 있게 결정한 뒤 필요한 client에 동일한 montage 상태를 전달한다. animation blueprint는 network play에 권장되는 Root Motion from Montages Only를 사용하며 character movement의 기본 root motion replication 경로를 유지한다.

과거 사례에서는 simulated proxy의 Root Motion Mode를 Ignore Root Motion으로 바꾸자 server transform replication이 다시 보였다. 이 수정은 모든 프로젝트에 적용할 수 없다. server transform만을 단일 진실로 삼고 animation root delta를 절대 적용하지 않도록 설계한 경우에만 역할별 설정을 검토한다.

검증 방법#

  • listen server와 dedicated server에서 각각 두 client 이상으로 시험한다.
  • montage 시작·중단·연속 재생과 late join을 확인한다.
  • 높은 latency와 packet loss에서는 위치 오차, montage position과 correction 횟수를 측정한다.
  • root motion이 없는 montage와 같은 이동을 비교한다.

주의점#

simulated proxy에서 root motion을 무조건 끄면 발 미끄러짐, montage 위치 불일치와 collision 결과 차이가 생기기도 한다. OnRep_ReplicatedMovement의 한 branch만 우회하기 전에 montage replication과 권한 구조부터 고친다.

참고 자료#

글 공유하기

이 글이 도움이 되셨다면 다른 사람과 공유해 주세요!

Root Motion 중 이동 리플리케이션이 멈춘 것처럼 보일 때
https://hon454.github.io/posts/root-motion-replication-simulated-proxy/
작성자
Jihoon Jeon
게시일
2023-08-23
라이선스
CC BY-NC-SA 4.0
관련 게시글스마트
1
언리얼 엔진의 리플리케이션 및 RPC 순서 보장
Unreal Engine프로퍼티 복제와 OnRep, RPC의 순서 보장 범위를 살펴보고, 일시적인 상태 불일치와 액터 간 준비 순서를 처리하는 방법을 예시로 정리한다.
2
면접 오답노트: 말하지 못한 주요 개념, Net Relevancy
Unreal Engine면접에서 제대로 답하지 못한 Net Relevancy를 다시 정리한다. AActor::IsNetRelevantFor의 판정 순서와 문서와 다른 부분, Owner가 판정을 바꾸는 방식, 연관성을 잃고 되찾을 때 RelevantTimeout과 액터 파괴, BeginPlay, OnRep, RPC에 생기는 일, ForceNetRelevant와 Replication Graph, Iris에서의 주의점, Dormancy, Priority와의 차이를 다룬다.
3
휴면 액터 깨우기: FlushNetDormancy, ForceNetUpdate, SetNetDormancy
Unreal EngineUE 5.8.3 엔진 소스 기준으로 FlushNetDormancy, ForceNetUpdate, SetNetDormancy가 각각 무엇을 바꾸는지 비교한다. 휴면 정책과 휴면 상태의 차이, ForceNetUpdate가 덤으로 하는 flush가 빠지는 조건, 값을 바꾼 뒤 깨우면 FastArray 변경이 사라지는 문제, 이를 막는 setter 패턴과 Push Model을 함께 쓸 때의 주의점을 정리한다.
4
Unreal Engine PIE에서 클라이언트와 서버 값을 한 줄로 비교하기
Unreal EnginePIE에서 클라이언트 코드가 같은 프로세스의 서버 월드와 서버 측 PlayerController를 찾아 위치·속도를 한 줄로 비교하는 에디터 전용 디버그 코드와, 네트워크 에뮬레이션으로 확인한 측정 결과를 정리합니다.
5
Unreal Engine - Replication Graph
Unreal EngineUE 5.8.3 소스와 테스트 프로젝트 실측으로 Replication Graph가 기본 드라이버의 무엇을 줄이고 무엇을 줄이지 않는지 확인한다. 액터 5,000개와 클라이언트 16개까지의 측정, 효과가 있는 설정값과 이름과 반대로 동작하는 설정값, 커스텀 그래프의 라우팅과 Team Node, 5.8.3에서 재현한 버그 다섯 가지, 도입 기준과 Iris와의 관계를 다룬다.
무작위 게시글무작위

댓글

Profile Image of the Author
Jihoon Jeon
안녕하세요! 서브컬처와 자전거를 사랑하는 개발자 전지훈입니다.
공지사항
제 블로그에 오신 것을 환영합니다! 예시 공지입니다.
카테고리
태그
최신 일상
사이트 통계
게시글
73
카테고리
10
태그
143
총 단어 수
133,527
운영 일수
0일
최근 활동
0일 전
사이트 정보
빌드 플랫폼
GitHub Actions
블로그 버전
Firefly v6.16.9
라이선스
CC BY-NC-SA 4.0
목차