1. 채팅 프로젝트 프레임워크 및 UI 세팅

  • 게임 프레임워크 구성: CXGameModeBase와 CXPlayerController를 C++로 생성하고, 이를 상속받는 블루프린트 클래스를 만들어 Chatting 레벨의 World Settings에 적용한다.
  • 채팅 UI 연결 및 출력 로직: UEditableTextBox를 활용해 텍스트 입력을 받고, 엔터키 입력 시 델리게이트를 통해 플레이어 컨트롤러로 텍스트를 전달하여 화면에 출력한다.
  • UI 생성의 한계와 해결: 기존 로직대로면 내가 띄운 채팅창이나 UI가 다른 플레이어의 화면에도 뜨는 문제가 발생합니다. UI는 클라이언트 로컬 환경에서만 띄워야 하므로 IsLocalController()를 사용해 조건을 나눈다.

2. 서버의 종류 및 구조

  • P2P (Peer to Peer): 각 컴퓨터가 클라이언트이자 서버 역할을 동시에 수행한다.
  • Listen Server (리슨 서버): 방장(Host)이 서버 겸 클라이언트 역할을 하고, 나머지는 클라이언트로 접속한다. (예: 마인크래프트)
  • Dedicated Server (데디케이티드 서버): 오직 서버 연산만 담당하는 전용 컴퓨터가 존재한다. 그래픽 렌더링이나 UI 출력이 없어 대규모 멀티플레이에 적합한다.
  • 서버-클라이언트 구조의 특징: 클라이언트끼리의 직접 통신은 불가능하며, 모든 데이터는 서버를 거쳐야 한다. (이후 배울 RPC 및 변수 리플리케이션의 핵심 원리)

3. 네트워크 상태와 통신 객체 (NetMode, NetConnection, NetDriver)

NetMode (월드의 네트워크 상태)

해당 게임 프로세스가 네트워크상에서 어떤 역할을 하는지 나타낸다.

  • NM_Standalone: 싱글 플레이어 모드. (서버/클라이언트 구분 없음)
  • NM_DedicatedServer: 데디케이티드 서버. (플레이어 화면 없음)
  • NM_ListenServer: 리슨 서버. (서버이면서 클라이언트 화면 존재)
  • NM_Client: 클라이언트. (서버 로직 없이 복제된 결과만 보여줌)

NetDriver와 NetConnection

  • NetDriver: 네트워크 통신을 관리하는 로우레벨 클래스. 멀티플레이가 켜질 때만 생성돤다.
  • NetConnection: PC 간의 연결을 의미한다. 서버는 접속한 클라이언트 수만큼 ClientConnection을 가지고, 클라이언트는 서버와 연결되는 단 하나의 ServerConnection을 가진다.

4. NetRole (액터의 권한 상태)

멀티플레이에서 같은 코드가 여러 PC에서 실행될 때, 해당 액터가 어느 PC에서 어떤 권한을 가지고 있는지 구분하기 위해 사용합니다. HP 감소, 아이템 스폰 등 게임에 중대한 영향을 미치는 로직은 해킹 방지를 위해 반드시 서버(Authority)에서 처리해야 한다.

NetRole의 종류

  • Authority (권한자): 서버에 존재하는 원본 액터입니다. 중요한 게임 로직 처리를 담당. HasAuthority() 함수로 확인 가능하다.
  • Autonomous Proxy (자율 프록시): 클라이언트 컴퓨터에 복제된 내 캐릭터(또는 컨트롤러). 사용자 입력을 받아 서버로 보낸다.
  • Simulated Proxy (시뮬레이트 프록시): 내 화면에 보이는 '다른 플레이어'의 캐릭터다. 서버에서 연산된 결과를 수신받아 시각적으로 동기화만 한다.
  • None: 네트워크 통신과 무관한 액터이다.

Local Role vs Remote Role

단순히 권한 유무만 파악하는 것이 아니라, 해당 액터가 현재 동작 중인 PC에서의 역할(Local)과 연결된 상대방 PC에서의 역할(Remote)을 교차 검증하여, 서버에서 생성된 단순 NPC인지 실제 플레이어가 조종하는 캐릭터인지 정확히 구분한다.

+ Recent posts