강의 예제
: 언리얼 엔진에서 리슨 서버 NetMode 로 채팅을 구현해 보는 예제
예제에서 구현한 로직
[레벨 블루프린트] BeginPlay
1. IsServer 여부에 따라 플레이어 컨트롤러의 로그인 이벤트 호출
--> 인자 : "Host"(서버인 경우) / "Guest" (클라이언트인 경우)
[플레이어 컨트롤러] 로그인 이벤트 (Run on server)
1. 멤버 변수 UserID = 매개변수로 받은 스트링 대입
2. 로그인 알리는 디스패처 호출 - 아래 위젯의 로그인 이벤트가 구독하고 있음
[위젯] 로그인 이벤트
1. Construct 시 위의 디스패처에 바인드 되는 이벤트
2. 호출 시 Editable Text Box 를 전달받은 UserID 스트링으로 SetText
발생한 문제
서버에는 UserID 가 잘 반영되나 위젯이 UserID 로 SetText 되지 않고 디폴트 값 그대로 디스플레이 됨
강의 내용을 되짚어보고, 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 등에 대한 감이 조금 더 생기지 않았을까?!?!?!
'언리얼_엔진_게임개발_공부 > 언리얼 네트워크' 카테고리의 다른 글
C++ 로 채팅 예제 구현 - ChatWidget ~ GameMode & 유저네임 중복체크 / 색상 랜덤 부여 (0) | 2025.03.20 |
---|---|
C++로 채팅 예제 구현하기 - PlayerController ~ LoginWidget (0) | 2025.03.19 |
데디케이티드 서버 활용 미로 게임 예제 분석 (0) | 2025.03.18 |
언리얼 엔진의 네트워크 / NetMode / Replication (0) | 2025.03.12 |
서버 부하 분산 - 로드 밸런싱 - L4 / L7 스위치 (0) | 2025.03.11 |