1. 필요한 것
1 - 1. Level과 Level BP
- 빈 레벨이 필요
- 빈 레벨 BP에서는 아래 두가지 동작을 하게 된다.
- widget BP를 Add To Viewport 하기
- server인지 체크 후, On Log In with ID 라는 이벤트(PlayerController가 가지고있음) 실행
1 - 2. GameMode
- Got Message From Client 라는 이벤트를 가진다. (리플리케이트 : 서버에서 실행 / 신뢰성 true)
- PlayerController를 상속받아 만들어진 actor를 모두 찾은 후
- 우리가 만든 PlayerController로 cast 후
- Got Broad Cast 이벤트(PlayerController가 가지고 있음)를 호출한다.
1 - 3. PlayerController
- BeginPlay 이벤트
- 우리가 만든 Widget BP를 가져와서 SetMessageToUserController라는 이벤트 디스패처를 bind 해준 후
- OnSendMsgToServer 이벤트를 만든다.
- OnSendMsgToServer 이벤트 (리플리케이트 : 서버에서 실행 / 신뢰성 true)
- GameMode를 가져와서 GotMessageFromClinet라는 이벤트를 call해준다.
- GotBroadCast 이벤트 (리플리케이트 : 소유중인 클라이언트에서 실행 / 신뢰성 true)
- Authority 체크 후 PrintString 진행
- OnLogInWithID 이벤트 (리플리케이트 : 서버에서 실행 / 신뢰성 true)
- UserId 라는 변수 set
1 - 4. Widge BP
- 디자이너 탭
- editable text를 하나 가진다. (변수여부 체크)
- 그래프 탭
- on text committed 이벤트
- set message to user controller라는 이벤트 디스패처
- 텍스트 입력 후 enter를 입력하게 되면, set message to user controller라는 이벤트 디스패처를 call 한다
- 이후 text 를 비워준다.
2. 흐름
2 - 0. 생성 시
- Widget BP는 SetMessageToUserController라는 이벤트 디스패처를 가짐
- GameMode BP는 GotMessageFromClient라는 이벤트를 가진다.
- 이 이벤트는 우리가 만든 PlayerController를 가져와서 GotBroadCast라는 이벤트를 Call해준다.
2 - 1. Level BP
- 우리가 제작한 Widget BP를 Add To Viewport 한다.
- 이후 server인지 체크 후, 우리가만든 PlayerController로 캐스팅해 On Log In With ID 이벤트를 call 한다.
- On Log In With ID 이벤트는 PlayerController에서 User ID라는 변수를 Set하는 동작을한다.
2 - 2. PlayerController
- 생성 시 remote role을 체크하여 None이 아닌 경우(서버/클라가 네트워트 동기화하고있다는 의미) 우리가 만든 Widget BP에 해당하는 widget을 가져와서
- SetMessageToUserController 이벤트 디스패처를 OnSendMsgToServer라는 이벤트와 바인딩한다.
- OnSendMsgToServer 이벤트는 우리가 만든 GameMode를 가져와서 GotMessageFromClient 이벤트를 Call한다.
- GotMessageFromClient 는 다시 PlayerController의 GotBroadCast를 Call한다.
- GotBroadCast 이 함수는 최종적으로 화면에 PrintString을 해주게 된다.
결과 영상
3. 용어
3 - 1. Authority
- 액터가 "서버에서 실행되고 있는가" 를 판단하는 기준
- 즉, 서버가 Authority를 가진다.
- 리슨 서버의 경우 서버가 클라이언트의 역할도 수행하기 때문에, Authority 체크가 필요하다.
3 - 2. Remote Role
해당 액터가 원격에서 어떤 역할을 하는지 나타냄
참고) 현재 동작하는 application에서의 동작은 Role이라고 한다.
- None
- 역할 없음, 복제되지 않는 액터
- Simulated Proxy
- 다른 클라이언트의 원격 제어를 받는 액터
- 시뮬레이션만 수행하는 객체
- 상태를 변경하거나 원격 함수 호출 불가능
- Autonomous Proxy
- 플레이어가 직접 컨트롤 하는 액터
- 상태 변경 및 원격 함수 호출 가능
- Authority
- 서버에서 실행
3 - 3. Replicate
네트워크 환경에서 서버와 클라이언트 간의 함수 호출을 동기화 하는 방식
RPC라고도 한다.
이때, 실행의 주체(서버 or 클라)가 누구인지 Replicate될 액터의 소유권(게임모드, 플레이어 컨트롤러 등) 이 무엇인지를 체크해야 한다.
- Not Replicated
- Multicast
- 이 이벤트를 서버에서 실행하면, 모든 클라이언트에서 실행
- 클라이언트에서 실행하면, 호출한 클라이언트에서만 실행
- Run On Server
- 실행 주체에 관계없이 서버에서 실행
- Run on owning Client
- 모든 클라이언트가 Replicate된 액터를 소유하지 않기 때문
- 액터를 소유한 클라이언트에서만 실행
4. 트러블 슈팅
채팅을 구현한 후 플레이하니 아래와 같은 warning이 출력되는 문제가 있었다.
구글링을 하다가 아래 글을 참고하게 되었고,
https://www.reddit.com/r/unrealengine/comments/16ticsp/error_on_a_new_empty_project_53/?rdt=46350
From the unrealengine community on Reddit
Explore this post and more from the unrealengine community
www.reddit.com
에디터 개인설정에서 login에 credential에 추가해주니 warning이 사라졌다.
5. 참고자료
https://velog.io/@singery00/UE5-%EB%A9%80%ED%8B%B0%ED%94%8C%EB%A0%88%EC%9D%B4-Replication-1
[UE5] 🖧 멀티플레이 Replication (1)
🖧 Unreal의 Replication 개념을 알아보고 멀티플레이를 만들어보자.
velog.io
https://tithingbygame.tistory.com/53
[언리얼5/UE5] Authority, Simulated Proxy, Autonomous Proxy
멀티플레이어 게임을 만들다가 중간 중간 헷갈리니 정리를 해놓자!Controller은 simulated proxy에서 유효하지 않는다! 에서 시작된 정리...1. AuthorityAuthority는 오브젝트를 제어하는 주체를 의미한다.
tithingbygame.tistory.com
'Unreal Engine' 카테고리의 다른 글
Unreal Engine - Gameplay Framework (0) | 2025.03.24 |
---|---|
Unreal Engine - UObject (0) | 2025.03.24 |
Unreal Engine - Main Menu (흐름 위주의 정리) (0) | 2025.03.07 |
UE5 Issues : ADS (Aim Offset 1D) (0) | 2025.03.05 |
Unreal Engine - Sound play & Effect spawn (0) | 2025.03.05 |