https://github.com/Jak-Jang/Asgmt09
<aside> 💡
네트워크 기능을 추가하기 전, 플레이어가 입력을 하고 그 결과를 화면에서 확인할 수 있는 기본적인 채팅 시스템을 먼저 구현합니다.
가장 먼저, 프로젝트에 필요한 모듈을 설정합니다. UI(UMG, Slate), 입력(InputCore, EnhancedInput) 등 게임에 필요한 기능들을 .Build.cs
파일에 추가하여 엔진이 해당 모듈들을 함께 빌드합니다.
TextInputWidget
UEditableTextBox
를 이용해 플레이어가 텍스트를 입력할 수 있는 UI 위젯을 생성합니다.OnChatInputTextCommitted
함수가 호출되도록 바인딩합니다.PlayerController
BeginPlay
시점에서 위젯을 생성하고 화면(Viewport)에 추가합니다.SetChatMessageString
함수를 통해 위젯으로부터 텍스트를 받아, PrintChatMessageString
함수로 화면에 출력합니다.Code
<aside> 💡
단일 플레이어 채팅 기능을 멀티플레이어 환경으로 확장합니다. RPC(Remote Procedure Call) 를 사용하여 클라이언트의 입력을 서버로 보내고, 서버가 모든 클라이언트에게 메시지를 전송(Broadcast)하도록 구현합니다.
PlayerController
ServerRPC...
: 클라이언트에서 호출하면 서버에서 실행되는 함수입니다.ClientRPC...
: 서버에서 호출하면 특정 클라이언트에서 실행되는 함수입니다.SetChatMessageString
함수에서 ServerRPCPrintChatMessageString
를 호출하여 서버로 메시지를 보냅니다.ServerRPC...
함수는 현재 접속된 모든 PlayerController
를 찾아 ClientRPCPrintChatMessageString
를 호출합니다.ClientRPC...
함수가 각 클라이언트에서 실행되어 PrintChatMessageString
를 통해 모든 플레이어의 화면에 메시지가 출력됩니다.GameState, GameMode
GameMode
는 서버에만 존재하며, OnPostLogin
함수는 플레이어가 서버에 접속했을 때 호출됩니다.GameState
는 서버와 모든 클라이언트에 존재하는 액터로, 게임의 전반적인 상태를 공유하는 데 사용됩니다.GameMode::OnPostLogin
이 호출됩니다.GameMode
는 GameState
의 MulticastRPC...
함수를 호출합니다.NetMulticast
RPC는 서버와 모든 클라이언트에서 실행됩니다. 이 RPC를 통해 모든 플레이어에게 "OOO has joined the game" 입장 메시지를 출력합니다.Code
<aside> 💡
기본 채팅 시스템 위에 숫자 야구 게임의 규칙을 적용합니다. 모든 게임 로직은 **서버의 GameMode
**에서만 처리하여 모든 플레이어가 동일한 게임 환경을 공유합니다.
PlayerState
PlayerState
는 특정 플레이어에 대한 정보(이름, 시도 횟수 등)를 저장하고 모든 클라이언트에게 복제(Replication)하는 역할을 합니다.bReplicates = true
로 설정하고 GetLifetimeReplicatedProps
함수에 복제할 변수들을 등록(DOREPLIFETIME
)합니다.GameMode
BeginPlay
: GenerateSecretNumber
를 호출하여 중복되지 않는 3자리 정답 숫자를 생성합니다.PrintChatMessageString
: 유효한 3자리 숫자인지(IsGuessNumberString
) 판별합니다.
JudgeResult
로 Strike/Ball을 계산하고, 결과를 모든 클라이언트에게 전송합니다. 이후 JudgeGame
으로 승리/무승부 조건을 확인합니다.ResetGame
: 게임이 끝나면 정답 숫자를 새로 생성하고 모든 플레이어의 시도 횟수를 초기화합니다.PlayerController
ServerRPCPrintChatMessageString
의 역할을 수정합니다. 이제 서버는 메시지를 직접 브로드캐스트하는 대신, GameMode
의 PrintChatMessageString
함수를 호출하여 게임 로직 처리를 위임합니다.NoticeText
변수를 Replicated
로 선언합니다. 서버의 GameMode
가 게임 결과를 판정하고 이 변수 값을 바꾸면, 모든 클라이언트의 NoticeText
값이 자동으로 동기화됩니다. 이 값은 UI 위젯에 바인딩하여 게임 결과를 표시합니다.Code