Post

2026-06-29 TIL (86일차)

2026-06-29 TIL (86일차)

CrazyRoo: 비대칭 협동 멀티플레이어 프레임워크 구현 요약

작성하신 코드는 4명의 플레이어가 하나의 캐릭터를 조작하며 진행하는 비대칭 협동 러닝 액션 게임의 핵심 멀티플레이 시스템 및 진행 프레임워크입니다[cite: 6]. 엔진의 핵심 클래스(GameMode, GameState, PlayerController, PlayerState, GameInstance)를 역할에 맞게 완벽히 분리하여, 네트워크 동기화와 서버 권한 관리가 안전하게 이루어지도록 설계되었습니다[cite: 1, 2, 3, 4, 5].

어떤 구조와 기능들로 완성되었는지 핵심 항목별로 요약해 드립니다.


1. 4인 비대칭 역할 분담 시스템

플레이어들이 각자의 포지션을 맡아 하나의 게임플레이를 완성하도록 구성되었습니다.

  • 독립적인 역할 체계: 좌측 이동, 우측 이동, 사격 및 해킹, 회피(점프/숙이기) 등 4가지 고유 역할을 열거형(Enum)으로 정의했습니다[cite: 6].
  • 중복 방지 및 자동 배정: 서버(GameMode)는 누군가 이미 고른 역할을 다른 사람이 중복해서 선택하지 못하게 막고, 빈 자리가 있으면 새로 접속한 유저에게 남은 역할을 자동으로 배정합니다[cite: 2].
  • 심리스(Seamless) 데이터 유지: 로비 레벨에서 선택한 역할 데이터는 GameInstance에 안전하게 보관되어, 스테이지 레벨로 이동(Travel)하더라도 초기화되지 않고 그대로 복원됩니다[cite: 1, 2].

2. 단계별 매치 상태(Match State) 관리

방 입장부터 게임 종료까지의 전체 흐름을 상태 머신(State Machine) 형태로 견고하게 제어합니다.

  • 체계적인 상태 전환: 인원 대기 ➔ 역할 선택 및 준비 ➔ 카운트다운 ➔ 주행(인게임) ➔ 게임 오버 ➔ 결과 정산의 단계로 흘러갑니다[cite: 6].
  • 시작 조건 검증: 지정된 최소 인원이 모이고, 모두가 ‘준비 완료’ 상태가 되어야만 카운트다운이 시작됩니다[cite: 2].
  • 상태 기반 권한 제어: 역할 변경이나 준비 상태 토글은 오직 ‘대기’ 및 ‘역할 선택’ 단계에서만 가능하도록 차단하여, 주행 중에 역할이 바뀌는 버그를 원천 봉쇄했습니다[cite: 2, 4].
  • 유연한 예외 처리: 게임 진행 중에 누군가 연결이 끊기거나 나가면 즉시 방을 폭파(해산)하고, 남은 인원들을 전원 메인 메뉴로 강제 복귀시켜 게임이 멈추는 현상을 방지합니다[cite: 2].

3. 서버 권한 기반(Authority) 데이터 동기화

모든 중요한 게임 데이터의 변조를 막고, 클라이언트 화면을 똑같이 맞추기 위해 서버가 절대적인 통제권을 가집니다.

  • 상태 복제 (Replication): 매치 상태, 공유 체력(HP), 주행 거리, 점수, 남은 시간 등 게임의 핵심 정보들은 GameState를 통해 서버에서 모든 클라이언트로 실시간 복제됩니다[cite: 3].
  • 반응형 UI 설계: 체력이 깎이거나 점수가 오를 때 엔진의 OnRep 기능이 작동하며 즉시 델리게이트(Delegate)를 방송(Broadcast)합니다[cite: 3, 5]. 이를 통해 UI나 이펙트 시스템이 데이터 변경을 즉각적으로 감지하고 화면을 갱신합니다[cite: 3, 6].
  • 안전한 피해 처리: 장애물 충돌로 인한 피해량 차감 로직 등은 오직 서버 권한을 가진 곳에서만 수행되며, 0 이하가 되면 즉시 게임오버 상태로 넘깁니다[cite: 2, 3].

4. 안전한 클라이언트-서버 통신 (RPC & 검증)

클라이언트의 조작 입력이 서버로 전달되는 과정에 3단계 철벽 방어를 구축했습니다.

  • RPC 3종 세트 패턴: 플레이어가 키를 누르면 PlayerController가 즉시 처리하지 않고, Server RPC를 호출하여 서버 쪽에 요청을 보냅니다[cite: 4].
  • 입력값 검증 (Validation): 서버는 수신된 입력값이 정상적인지 1차로 확인(_Validate)하여, 비정상적인 값(예: 방향 없음)을 보낸 경우 요청을 즉시 폐기합니다[cite: 4].
  • 행동 훅(Hook) 위임: 검증을 통과한 입력(차선 이동, 회피, 사격 등)은 GameMode로 전달되며, 실제 물리적인 캐릭터의 움직임이나 총알 발사 로직은 블루프린트(BP_On... 이벤트)에서 구현할 수 있도록 깔끔하게 분리했습니다[cite: 2].
This post is licensed under CC BY 4.0 by the author.