[동작 순서]

[작업 순서]
1. Blank 템플릿으로 프로젝트 생성
2. LV_Chat으로 Empty Level 생성
3. GameModeBase를 상속받는 BP_ChatMode를 생성
4. PlayerController를 상속받는 BP_Controller 생성
5. World Settings에서 새로 생성한 BP_ChatMode와 BP_Controller를 지정해준다.
6. MULTIPLYAER OPTIONS(플레이 버튼 옆의 점 3개를 클릭하면 나오는 드롭다운에서 제일 하위에 있음.)에서 Number of Players의 수를 '2'. Net Mode를 'Play As Listen Server'로 설정
7. Project Settings -> Maps & Modes -> Default GameMode, Global Default Server Game Mode, Editor Startup Map, Game Default Map을 각각 새로 생성한 BP_ChatMode와 LV_Chat으로 설정
8. Widgets 폴더 생성 후 Widget Blueprint를 생성(Widget_CharWindow로 명명)
8-1. Canvas 추가 후 EditableTextBox를 하위 항목으로 추가.
8-2. isVariable 체크 후 OnTextCommitted 추가하여 이벤트 생성
8-2-1. OnTextCommitted : 사용자의 Enter 키 입력 혹은 텍스트 박스가 포커스를 상실한 경우 호출

8-2-2. Controller에서 Bind목적의 Event Dispatcher 'SetMessageToUserController'를 생성하고 Input으로 OnTextCommiteed에서 전달받은 Text를 입력해 준다.
8-2-3. 최종으로 Editable Text Box의 텍스트 내용을 초기화하여 메세지가 전달된 것과 같은 효과를 부여한다.

8-3. 생성한 위젯을 레벨 블루프린트에서 CreateWidget 노드를 이용하여 생성 후 Add to Viewport 노드로 추가해준다.
9. BP_Controller에 Widget_CharWindow의 Event Dispatcher를 바인딩하는 BeginPlay 로직 구현

9-1. GetRemote Role을 통해 해당 컨트롤러가 ROLE_None(네트워크에서 복제되지 않음을 의미)가 아닌 경우에만 로직을 처리한다.
9-2. 위젯의 생성까지 Delay 노드를 통해 수행시점 제어
9-3. 8에서 만든 위젯을 찾아온다. 필요한 위젯은 Widget_ChatWindow이므로 해당 타입으로 캐스팅
9-4. Bind Event to Set Message to User Controller 노드를 추가하고 이 노드와 연결될 이벤트(OnSendMsgToServer)를 생성해준다.
10. 메세지를 보냈으면 보낸 메세지를 받을 이벤트도 필요하다. Custom 이벤트(Got Broadcast)를 만들어주고 입력으로는 String 타입 변수(Msg)로 설정해 준다.
11. BP_GameMode로 이동하여 Custom 이벤트(GotMessageFromClient)를 생성해준다. 해당 이벤트는 서버와 연결된 모든 Controller에 Msg를 브로드캐스팅하여 유저들의 화면에 메시지를 출력해주는 역할을 할 것이다.

11-1. GotMessageFromClient는 사용자로부터 서버로 메세지가 전달되는 것이므로 서버에서 실행되어야 한다. 따라서 Run on Server로 Replicates를 설정해준다. 그리고 채팅은 순서 보장 및 ACK, 전달 보장이 되어야 하므로 Reliable(신뢰성)을 체크해준다.
11-2. 서버쪽에서 다른 모든 사용자에게 다시 메세지를 전달해 주어야 하기 때문에 BP_Controller의 Got Broadcast를 통해 유저들에게 받은 메세지를 전달해준다.
12. OnSendMsgToServer, GotBroadcast 이벤트의 구현
12-1. OnSendMsgToServer는 Client에서 Server로 향하는 RPC이기 때문에 Replicate를 Server에서 실행으로 선택해준다. GotBroadcast의 경우 Server에서 Client로 향하는 RPC이기 때문에 소유 중인 Client에서 실행을 선택한다.
12-2. OnSendMsgToServer의 경우 최종으로 BP_ChatMode를 통해 다른 유저에게 메세지를 전파해야 하므로 GotMessageFromClient 노드를 호출해준다.

12-3. GotBroadcast의 경우 전달받은 메세지를 Print String으로 출력해주면 된다. 이 때, HasAuthority 노드를 이용해서 권한 확인을 해 주어야 한다. 현재 만든 로직은 Listen Server에서 동작할 것을 감안하고 제작했기 때문에 체크해주지 않으면 Server측에서 String을 출력해주는 것과 Client측에서 String을 출력하는 것으로 두 개가 출력되게 된다.

13. PlayerController에 OnUserLogin으로 Event Dispatcher를 생성한다. 그리고 OnLoginWithID라는 커스텀 이벤트를 서버에서 실행하기, Reliable로 설정해준다.

14. 레벨 블루프린트에서는 아래와 같이 노드를 추가해준다. 이 구현에서는 Host와 Guest 두 명으로만 가정하고 구현했다.

'Unreal Engine > 이것 저것' 카테고리의 다른 글
| [강의] Haker UE5 소스코드 분석#1(게임 프레임워크) - 2.환경설정 (0) | 2025.12.08 |
|---|---|
| [엔진 소스 코드 분석] 1 - LaunchWindows.cpp (0) | 2025.03.26 |
| 게임 언패킹과 리타게팅, 그리고 머티리얼에 대하여 ( 1 ) (0) | 2025.02.07 |
| 에디터에서 FVector 수정을 위한 UPROPERTY 사용 (0) | 2025.02.03 |
| 유튜브 레퍼런스 (0) | 2025.02.01 |