언리얼 엔진 본캠프 15주차-2 언리얼 엔진 C++ : 야구 게임 - 트러블 슈팅4

정재훈·2025년 3월 25일
0

unreal engine

목록 보기
34/45

트러블 슈팅4

MulticastRPC

일단 MulticastRPC는 서버에서 호출하면 모든 클라이언트에서 호출되는 RPC임

정확히 말하면 서버 측 객체(액터)에서 MulticastRPC를 호출하면, 이 객체와 리플리케이션이 된 모든 클라이언트 측 객체(액터 - character, pawn, state, controller, custom actor 등등)에서 함수를 호출하는 것임

위 사진에서 중앙에 서버와 클라이언트가 같이 가지고 있는 객체(액터)와 bReplicates=true로 설정한 Actor들에서 MulticastRPC를 효과적으로 사용할 수 있음

다이어그램에 Multicast를 덧붙여보면, 아래 그림과 같이 됨


PlayerController에서의 MulticastRPC

마지막으로 턴 제한 시간을 UI에 표시해주고 싶어서 GameState에서 Turn이 시작되면, 0.1초 마다 UI를 업데이트하는 함수를 타이머로 세팅하고, 해당 함수에서 PlayerController의 UI를 업데이트하는 MulticastRPC함수를 호출하면 되겠다 생각했음

트러블 슈팅1에서 봤드시 PlayerController는 서버에서 생성하고 클라이언트에게 나눠주는 식이여서 서버는 모든 PlayerController를 다 가지고 있으니, 서버의 PlayerController에서 Multicast를 하면 서버에 있는 다른 모든 PlayerController들도 MulticastRPC함수를 호출해서 UI 업데이트가 될 거라 생각하고 아래와 같이 구현을 하였는데

막상 실행해보니 서버 창에서만 제한 시간 UI가 갱신되고 클라이언트 창은 갱신이 안되었다

이유는.. MulticastRPC에 대해 제대로 이해하지 못한 것임.

위에 MulticastRPC 설명을 보면 Multicast는 자기 자신을 리플리케이션한 액터들에서도 호출되도록 하는 거고, 지금 코드는 그냥 리슨 서버의 Local PlayerController만 Multicast 하도록 되어있음(서버는 리플리케이션할 대상이 없긴 하지만)
=> 서버 창의 UI만 갱신

방법1

이 구조를 유지하면서 해결하려면, GameState에서 모든 PlayerController를 대상으로 Multicast하면 되긴 되는데, 이러면 또 문제 아닌 문제가 발생함

  • 수정 코드

실행해보면 UI 갱신은 정상적으로 되는데, 로그를 보면

다이어그램과 Multicast를 덧붙인 그림에서 볼 수 있드시, Multicast를 하면 서버의 Client1의 PlayerController에서도 호출이 된다는 것임(이 호출은 불필요한 호출임)

이걸 방지하려면 MulticastRPC가 아니라 그냥 ClientRPC로 하면 방지할 수 있음

방법2

방법1은 GameState에서 직접 모든 PlayerController를 돌면서 ClientRPC 함수를 호출하는 방식으로 MulticastRPC를 사용하지 않는 방법임

방법2는 조금 다르게 직접 모든 PlayerController를 순회하는 게 아니라 MulticastRPC를 이용하는 방식

실행해보면 문제없이 동작한다

시간 갱신도 잘되고, 로그에도 불필요한 호출이 없는 걸 볼 수 있다.

profile
드가자

0개의 댓글