Game Develop

[UE5][이슈] 몽타주재생시 노티파이호출타이밍 조심해야 한다. 본문

UnrealEngine5/이것저것

[UE5][이슈] 몽타주재생시 노티파이호출타이밍 조심해야 한다.

MaxLevel 2024. 6. 21. 23:59

 

 

상황 

A라는 몽타주를 재생하다 StopAllMontage(0.2f)를 호출하고, B몽타주를 재생하게 해놨음.

 

A라는 몽타주의 7프레임정도에 노티파이를 심어놨다고 가정.

 

B에도 10프레임정도?에 노티파이를 심어놨다고 가정.

 

내가 예상한 결과는, A라는 몽타주를 재생하다 7프레임 이전에 StopAllMontage(0.2f) 호출 후, B몽타주 재생시 당연히 자연스럽게 B를 재생. 7프레임이전에 Stop했으니 노티파이는 호출안된다고 생각.

 

그러니 당연히 될거라 생각하고 실행함.

 

 

결과 

10번중에 1번꼴로 B를 재생시작하자마자 A에 심어놨던 노티파이가 호출되는 이슈가 발생.

 

아예 B자체가 재생안된건가? 싶어서 애님인스턴스의 OnMontageStarted랑 OnMontageEnded라는 델리게이트변수에 로그출력용 함수를 바인딩하고 체크해봤는데, B의 OnMontageStarted가 호출되는것은 확인.

 

그리고 노티파이호출될때도 로그출력하게했는데, B가 재생시작되자마자 노티파이가 호출됨.

 

 

원인

 

StopAllMontage(0.2f)했던게 원인. 0.0f로 했어야 했다.

 

이 매개변수 0.2f의 의미는, 0.2초에 걸쳐 자연스럽게 블렌딩하면서 멈추겠다는 의미이다.

 

근데 그 0.2초에 걸치면서 A몽타주가 좀 더 재생되는 판정이라서, 노티파이가 심어진 7프레임에 다다르기 때문에 B가 재생되기 직전에 A에 심어진 노티파이가 호출되는 판정이 되버린 것.

 

그러니 B가 재생시작하자마자 A의 노티파이가 호출되는, 경험이없는사람한테는 정신나갈것같은 판정이 되는 것이였다.

 

0.2f대신 0.0f로 바꾸고 나서야, 바로 종료시키기 때문에 이전의 노티파이를 호출안시켜서 정상적으로 로직이 흘러갔다.

 

 

 

 

이것도 간략히 적은거지, 사실 심어놨다던 노티파이가 Pause시키는 노티파이였는데, 원래 B몽타주에도 똑같이 심어져있다.

 

그래서 처음에는 B몽타주 시작하자마자 퍼즈가 되길래, 처음엔 당연히 B에 심어놓은 노티파이가 호출된건줄 알았다.

뭔가 알수없는 어떠한 이유로 바로 해당프레임으로 점프한줄 알았다.

 

왜냐면 노티파이호출할 때 현재 활성화된 몽타주의 이름을 로그에 찍히게 했는데, B몽타주를 재생중이라고 뜨니 뭐 당연히 B몽타주의 노티파이가 호출된 줄 알았다.

 

그러니 생각의 흐름도 그쪽으로만 흘러갔었는데... 정말 혹시나해서 '설마 A몽타주께 호출된건가?' 라는 생각이 들어서 B몽타주의 노티파이를 제거했는데... 생각했던대로 A몽타주에 심어놨던 노티파이가 호출된거였다.

 

그러면 도대체 왜 A것이 호출되는가...? 에서 또 며칠을 날려먹었다.

 

그러다 아주 우연히 구글링하다 사람들이 대부분 몽타주 Stop할 때 0.0f를 쓰는거보고, '저거다' 라는 생각이 강렬히 들었다.

일단 0.0f로 바꾸고나서 버그가 안생기는것을 확인하고, 약간 끼워맞추기식일 수도 있는데 이유까지 생각해 낼 수 있었다.