UE5 DedicatedServer 환경에서, AnimNotify Trigger 되지 않는 이슈

#문제현상

  • AnimNotifyState 가 Client 에서는 Event ( Begin/Tick/End ) 가 호출되지만, DedicatedServer 에서는 아예 호출되지 않음
    • 위 현상으로 AnimNotifyState 를 기반 한 게임 동기화가 간헐적으로 틀어짐

AnimNotifyState 의 Begin/Tick/End 에서 Log 를 남겨보면,

Client 에서는, 1 프레임에 Begin/End 가 호출되지만,

Server 에서는 Begin/End Log 가 남지 않습니다. 중단점 역시 걸리지 않습니다.

#추가 참고 사항

  • 내부적으로 추적한 결과, Server 의 MoveAutonomous(…) 함수에서, Notify Trigger 관련 로직에서 문제가 있는 것 같습니다.
  • BranchingPoint Trigger Type 으로 변경하면, 위 현상이 발생하지 않습니다만, BranchingPoint AnimNotifyState 는, 동일한 타임라인에 2개 이상의 AnimNotifyState 를 배치할 수 없는 문제가 있어서, 사실상 적용하기 어려운 개발 정책인 것 같습니다.

재현 방법

#개발환경

  • UE5.6.0
  • Dedicated Server ( Play As Client )
  • Windows 11 (24H2) [10.0.26100.6584](x86_64)​

#문제 관련 설정 환경

  • ​Montage VisibliityBasedAnimTickOption
    • AlwaysTickPose 설정
  • a.EnableQueuedAnimEventsOnServer 1 설정​​
  • AnimNotifyState Trigger Type
    • Queue 방식

#재현방법

  • AnimNotifyState 를 최대한 짧게 설정
    • ​10 프레임 ( 약 0.15 sec )
  • Montage PlayRate 를 빠르게 설정
    • RateScale 3 이상 으로 설정​
  • UE5 GAS 를 통해, Client / Server 동일한 몽타주 재생
    • Client NetRole - AutonomousProxy
    • Server NetRole - Authority​

#재현률

  • 약 80 %

안녕하세요.

서버에서 항상 포즈를 업데이트해야 하는 경우가 아니라면 스켈레탈 메시의 VisibilityBasedAnimTickOption을 OnlyTickMontagesWhenNotRendered 로 변경하여 문제가 해결되는지 확인해보실 수 있습니다.

해당 옵션은 서버에서 노티파이를 트리거하고 다른 클라이언트와 동기화할 수 있도록 만들어진 옵션으로 네트워크 게임에서는 이 옵션을 사용하는 것이 주로 권장됩니다.

위 방법으로 문제가 해결되지 않거나 AlwaysTickPose를 사용해야 하는 경우 CL 47265321의 수정 사항을 적용해볼 수 있습니다.

https://github.com/EpicGames/UnrealEngine/commit/f1a7a24e28bf4627c23bc3cd5b2299510c373ccf

감사합니다.