1. 각 플레이어에게 3번의 기회가 있습니다. 2. “/124”과 같이 “/” 가 있으면 응답 패턴으로 간주합니다. 3. 아웃조건 1. “/”다음에는 3자리의 중복이 없는 1~9까지의 숫자가 중복있음. 2. “/”다음에 3자리가 아님 4. 무승부조건 : 플레이어 2명 모두 3번의 기회를 소모하고도 3S(trike)를 하지 못했을 때 5. 승리조건 1. 먼저 3번의 기회 안에 3S(trike)를 한 플레이어 승 2. 다른 플레이어가 아웃된 경우 남은 플레이어 승 6. 승리 또는 무승부의 경우 게임이 리셋
2. 전체적인 구조
<레벨 시작 → UI 표시 → Host/Guest 구분 → 숫자 입력 → 서버(GameMode) 전달 → 판정 후 UI에 결과> 반영 전반적인 구조는 “Listen Server(호스트가 서버 역할을 하면서 클라이언트도 플레이)” 환경에서 사용하는 방식이다.
서버-클라이언트 통신
“GameMode에서 GotMessageFromClient 이벤트 실행 → 판정 → 결과를 다시 UI로 전송” 하는 흐름
게임에서 서버 전용 로직(판정, 승패 처리)을 GameMode가 맡고, 클라이언트는 결과 UI 업데이트를 하는 방식은 정석적인 구조다.
Game Flow
게임 시작
✅ 게임이 시작되면 GameMode가 랜덤 숫자를 만든다. (예: “386”)
✅ 랜덤 숫자는 생성은 블루프린트 라이브러리를 통해 만들어준다 ➡️ GenerateRandomNuber
Host와 Guest가 각각 3번씩 기회를 갖는다. (Count = 3)
TurnIndex(또는 CurrentTurn)를 1로 설정해 시작한다. (홀수=Host 차례, 짝수=Guest 차례)
UI에서 숫자 입력
✅ 플레이어가 UI에서 “/123” 같은 형식으로 숫자를 입력하고 Enter를 누른다.
✅ 이 입력은 PlayerController를 거쳐 GameMode의 함수(서버 RPC)로 전달된다.
서버에서 판정
GameMode는 현재 차례(Host인지 Guest인지)와 입력을 확인한다.
만약 차례가 맞지 않으면(Host 차례인데 Guest가 입력 등) 무시하거나 에러 메시지를 보낸다.
Widget_ChatWindow에서 이벤트(OnSendMsgToServer)가 발생하면Set Message to User Controller가 실행되도록 이벤트를 바인딩한다.
메시지가 서버에 보내지면(채팅창 위젯에서 사용자가 메시지를 보내면), OnSendMsgToServer 이벤트 발생.
OnSendMsgToServer( 서버에서 실행되는 커스텀 이벤트 )가 Set Message to User Controller에 바인딩 되어 있으므로, 이벤트 발생 시 Set Message to User Controller가 실행된다!
OnSendMsgToServer이벤트는 게임모드를 가져와서(Get GameMode) BP_ChatMode로 캐스팅(Cast To BP_ChatMode)한다.
그리고 BP_ChatMode 내에 있는 Got Message from Client 함수를 호출한다.
이 함수는 "RELIABLE" 속성을 가지며, 서버로 복제되는 것(Run On Server)을 알 수 있다.
⚡Remote Role ➡️ Remote Role이 None이 아니라면 : 멀티플레이에서 서버/클라이언트 간 네트워크 동기화가 이루어지고 있다는 의미. 즉, 리슨 서버라는 거다. 리슨 서버는 Remote Role === None 체크 해야됨!
➡️ 온라인 게임을 친구들과 같이 한다고 생각해보자. 그 중 한 명이 호스트가 되어서 게임을 열고, 다른 친구들이 그 게임에 접속해서 같이 플레이하는 경우가 있는데, 이걸 Listen Server라고 한다. 이 때 호스트로 게임을 연 사람은 자기 컴퓨터에서 게임을 실행하면서 동시에 다른 친구들의 접속을 관리하는 역할도 해야 한다.
- Local Role (내 역할): 호스트 컴퓨터에서 실행되는 게임은 호스트 플레이어(자기 자신)를 직접 조작하고, 게임의 기본적인 규칙과 로직을 처리한다. - Remote Role (다른 사람 역할): 호스트 컴퓨터에서 실행되는 게임은 다른 친구들이 접속했을 때, 그 친구들의 캐릭터 움직임이나 행동을 받아서 게임에 반영해준다.
그래서 Remote Role은 내 컴퓨터가 다른 컴퓨터와 연결되어서 그 연결된 컴퓨터에 있는 플레이어의 역할을 대신 처리해 주는 것을 말한다.
➕ 액터들은 네트워크 게임에서 어떤 역할을 하는지에 따라 종류가 나뉜다. 1. None (없음): 해당 액터가 지금 이 컴퓨터에는 존재하지 않는다는 뜻. 그냥 없는 거다. 2. SimulatedProxy (모의 프록시):Authority 역할을 가진 액터의 복사본인데, 주로 다른 플레이어의 캐릭터나 움직이는 물건들을 표현할 때 쓰인다. 이 역할은 그냥 서버에서 보내주는 정보대로 화면에 보여주기만 하고, 스스로 어떤 게임 로직을 실행하지는 않는다. 마치 다른 사람이 조종하는 인형을 내가 보기만 하는 것과 같다. - AutonomousProxy (자율 프록시):Authority 역할을 가진 액터의 복사본인데, 특히 내 캐릭터를 표현할 때 많이 쓰인다. 내가 조작하는 대로 움직이는 것처럼 보이지만, 실제로는 서버에 있는 Authority에게 내 행동을 알려주고 확인받는 과정을 거친다. 마치 내가 조종하는 로봇인데, 진짜 로봇은 멀리 있는 사람이 관리하는 것과 같다. - Authority (권한자): 게임의 규칙을 정하고, 중요한 결정을 내리는 액터. 주로 게임 서버에 있는 액터들이 이런 역할을 맡아서 게임 로직을 실행한다. 마치 심판과 같다.
2.4. BP_ChatMode (GameMode)
BeginPlay에서 게임에 필요한 값을 초기화 한다 ➡️ 난수 생성, (turn 과 count 초기화, 타이머 초기화)
turn, count, 타이머 부분은 미구현 상태이다.
전체 모습, GotMessageFromClient ➡️ Run On ServerInitGame 함수 ➡️ 초기화(테스트용)IsValidInputCaculateResult, 승패 판 부분 미구현
2.5. Widget_ChatWindow (UI)
Widget_ChatWindow
1) 입력창에 '/'와 숫자를 입력하고 enter(커밋 : OnTextCommitted + SwitchOnETextCommit(OnEnter))를 누르게 되면, UI의 SetMessagetoUserController가 call(호출)되는데 이 이벤트 디스패처는 PlayerController에 OnSendMsgtoServer와 바인딩 되어있다 ⬇️ : 이렇게 구현함으로써 입력창에 메시지를 써서 엔터를 치면 서버로 메시지가 보내지는 것이다.
바인딩 되어 있는 SetMessagetoUserController
2) Rule에서 "/"가 있어야 응답 패턴으로 간주하므로... 채팅을 입력할 때: a. `Left` 노드를 통해 첫 글자를 가져온다 b. `/` 와 동일하다면?
True : CallSetMessage 이벤트 실행.
False : 올바른 입력으로 간주하지 않고, 오류 메시지 실행.
c. `/`을 제외한 오른쪽 텍스트를 반환해줘야 하기 때문에 `RightChop` 노드 사용.