- 데디케이티드, 리슨 서버에서 AnimNotfy로 설정한 Trigger가 제대로 동작하지 않는 경우가 있다.
- 이에 대한 이유는 서버에서의 애니메이션 설정이 다른것 + 언리얼 엔진 자체가 애니메이션을 제대로 평가하지 못한다는 환장의 콜라보이다.
언리얼 엔진에서 애니메이션의 업데이트
- 서버에서, 사실 서버에서 뿐 아니라 애니메이션은 항상 업데이트 될 필요가 없다.
- 실제로 애니메이션이 화면에 보이지도 않는데 매 순간 업데이트 해주면 낭비가 아니겠는가? 그렇기에 실제 애니메이션의 Tick을 돌리는 과정 자체와 각 Bone의 실제 Transform을 업데이트 하는 과정은 분리돼있다.
- 이에 대한 정보를 담고있는것이 Skeletal Mesh Component 의 VisibilityBasedAnimTickOption이다.

- Always Tick은 Animation의 Tick이 항상 돌아가는지 안돌아가는지를 의미하고 Refresh Bones는 실제로 각 Bone들의 Transform을 업데이트 할지에 대한 설정이다. 이를 통해 실제 틱이 도는것과 Bone의 업데이트를 분리하도록 설정할 수 있다.
- 이를 통해 우리는 애니메이션의 업데이트와 애니메이션 업데이트 과정에서 일어나는 이벤트의 평가를 분리하여 최적화를 진행할 수 있다.
- 그렇기에 서버에선 기본적으로 최적화를 위해 Always Tick Pose가 default로 항상 설정돼있다. (INI파일에서 default 설정값을 바꿀 수 있다곤 한다.)
게다가…
- 조사해보니 Always Tick Pose로 해당 변수가 설정돼있으면
PostAnimEvaluation
라는 함수가 제대로 실행되지 않는다고 한다.
Issues About Anim Notify On Server
- Evaluation이라 하면 실제 Bone에 대한 업데이트를 제외한 애니메이션 노티파이와 같은 평가가 진행될 거 같지만 실제 코드는 Refresh Bone이 진행돼야 Evaluation이 진행되도록 설정돼있다는 것이다.
- 그렇기 때문에 서버에서 애니메이션을 실행하면 AnimNotfy의 실행이 항상 보장되는게 아니라는 것이다. (서버 랙으로 인해 애니메이션의 프레임을 건너뛴다던가, 화면에 해당 스켈레탈 메쉬가 출력되고있지 않는다던가 하면 AnimNotify 는 실행되지 않을수도 있다는 것이다.)
해결방법
-
위 링크에선 해당 문제를 해결하기 위해 실제 엔진의 Evaluation이 진행되는 엔진 코드의 위치 자체를 변경한 것으로 보인다.
-
아래 링크에선 Always Tick Pose and Refresh Bone으로 설정을 변경해서 항상 Evaluation이 진행되도록 하여 해결한다.
Unreal4 - Dedicated Server에서 Animation시퀀스의 Notify 받는 방법
-
그리고 아래는 내가 해결한 방법이다.

- 그것은 애니메이션 몽타주 에셋의, Montage Tick Type을 Branching Point로 변경해 주는 것이다.
- 위 Montage Tick Type에는 Queued, Branching Point로 총 두 개의 type이 있다.
- 그 중에서 Queued는, 애니메이션 노티파이의 실행이 End of Evaluation Phase에서 실행된다고 하고 Branching Point는 해당 프레임의 애니메이션 Tick을 맞딱뜨리자 마자 실행된다고 나온다.
- 즉, 몽타주 업데이트를 Queued로 넣으면 Evaluation페이즈에서 지연된 상태로 Animnotfy가 실행되지만 Branching Point로 넣으면 지연되지 않고 해당 Tick에 진입하자 마자 바로 Trigger된다는 뜻이다. 그렇기에 해당 문제를 해결 가능하다.
잡담
- 언리얼 멀티플레이 게임을 디버깅하며, Network Emulation Profile을 Bad로 설정하면 서버에서의 AnimNotify의 호출이 100%보장되지 않는 현상을 경험하며 애니메이션 설정에 대해 이것저것 알게 된 것 같다.
- 애니메이션이랑 네트워크 설정이 이렇게 연관이 있다는 게 참 신기한 것 같다.