본문 바로가기
언리얼_엔진_게임개발_공부/언리얼 네트워크

Run on server / Run on owning client 잘 구분하여 쓰기

by jaboy 2025. 3. 13.

강의 예제

: 언리얼 엔진에서 리슨 서버 NetMode 로 채팅을 구현해 보는 예제

 

예제에서 구현한 로직

[레벨 블루프린트] BeginPlay

  1. IsServer 여부에 따라 플레이어 컨트롤러의 로그인 이벤트 호출

    --> 인자 : "Host"(서버인 경우) / "Guest" (클라이언트인 경우)

[플레이어 컨트롤러] 로그인 이벤트 (Run on server)

  1. 멤버 변수 UserID = 매개변수로 받은 스트링 대입

  2. 로그인 알리는 디스패처 호출 - 아래 위젯의 로그인 이벤트가 구독하고 있음

[위젯] 로그인 이벤트

  1. Construct 시 위의 디스패처에 바인드 되는 이벤트

  2. 호출 시 Editable Text Box 를 전달받은 UserID 스트링으로 SetText

 

 

발생한 문제

서버에는 UserID 가 잘 반영되나 위젯이 UserID 로 SetText 되지 않고 디폴트 값 그대로 디스플레이 됨

의도대로라면 우측 텍스트 박스에는 Guest 가 보여야 함

 

강의 내용을 되짚어보고, F9 로 브레이크포인트를 여기저기 찍어본 결과 아래와 같은 문제가 이유인 듯 하다.

 

Run on Server

  • 서버에 존재하며 GameMode 등 서버에서 구동되는 객체에 접근 (주로 클라이언트가 서버로 호출하는 용도)

Run on owning Client

  • 특정 플레이어의 클라이언트에 존재하며 사용자의 Widget 등 Replicate 되지 않는 클라이언트 고유 객체에 접근 (주로 서버에서 클라이언트로 호출되는 용도)

Multicast

  • 모든 클라이언트에 존재하며 서버가 클라이언트로 전송 시 공유

 

리슨 서버 (좌측) 의 경우 서버/클라이언트를 겸하기에 디스패처 호출이 되었을 때 위젯에 SetText 를 실행하지만,

클라이언트 (우측) 는 디스패처 호출이 SetText 로 이어지지 않는 것을 확인하였다.

아마 디스패처를 구독하는 위젯의 로그인 이벤트가 서버로 Replicate 되지 않는 위젯 안에 있는데, 정작 디스패처가 Run on Server 이벤트에서 호출되기에 듣지 못하는 게 아닐까 싶은데...?

 

이에 더해 UserID 와 같은 정보는 서버와 클라이언트 간 자동 동기화가 필요한 데이터라는 생각이 들었다.

그래서 아래와 같은 방식으로 정상 작동하도록 수정해 보았다.

 

1. [BP_Controller] UserID 변수를 Replicated 로 지정


2. [BP_Controller] 로그인 이벤트를 Run on server 이벤트와 Run on owning client 로 분리

2-1. 서버 이벤트 : UserID 변수 값 지정 (Replicated 이므로 클라이언트에도 반영)
2-2. 클라이언트 이벤트 : 디스패처 호출 >> 위젯에서 UserID 로 SetText


3. [레벨 블루프린트] BP_Controller의 서버 로그인 이벤트와 클라이언트 로그인 이벤트 모두 호출

 

최선일까?

아닐 것 같다.. ㅋ

왜냐? 나는 네트워크 공부가 처음이고 그냥 지금까지 배운 정보를 조합해 추론해본 것에 불과함.. 깨진 독에 덕테이프 붙이는 느낌

+

컨트롤러 내 로그인 클라이언트 이벤트에서 디스패처로 매개변수에 저장된 UserID 가 아니라 멤버 변수 UserID 를 전달하면 빈칸으로 뜬다...
브레이크포인트를 찍어보니 클라이언트의 경우 서버 로그인 이벤트가 클라이언트 로그인 이벤트, 컨트롤러 BeginPlay 이후에 호출된다.
즉, UserID 멤버변수가 "Guest" 로 초기화되기 전에 위젯이 먼저 SetText 된다.

 

그래서 뭔가 함수가 호출 시점을 변경한다면 클라이언트 로그인 이벤트도 매개변수 없이 멤버변수를 쓸 수 있을텐데...

일단 ... 어쨌든 실제 예제를 가지고 문제를 해결해보며 Run on server / Run on owning client / 프로퍼티 Replicate 등에 대한 감이 조금 더 생기지 않았을까?!?!?!