언리얼 엔진/언리얼 엔진 개념

Unreal Engine - 멀티플레이어 개념 정리

로안님 2025. 3. 17. 20:33

1. Server-Client 모델 개요

Unreal Engine의 멀티플레이어 시스템은 Server-Client 구조를 기반으로 동작합니다.

  • 서버(Server): 게임의 상태를 관리하고 최종적인 권한(Authority)을 가짐
  • 클라이언트(Client): 서버의 상태를 반영하여 게임을 플레이하는 개별 플레이어
  • 데이터 흐름: 클라이언트는 요청(Request)을 보내고, 서버가 이를 검증한 후 응답(Response)하여 변경된 상태를 전달함

이 구조를 유지하는 이유는 게임의 일관성을 유지하고 해킹을 방지하기 위해서이며, "Never Trust the Client" 원칙이 적용됩니다.


2. 실행 모드 종류

Unreal Engine에서는 네트워크 환경에 따라 여러 실행 모드를 제공합니다.

실행 모드 설명

Standalone 싱글플레이 모드로, 네트워크 기능 없이 동작
Dedicated Server 렌더링 없이 서버 전용으로 실행되며, 클라이언트 없이 게임 로직과 네트워크 통신만 처리
Listen Server 호스트 플레이어가 동시에 서버 역할을 수행하며, P2P 방식의 게임에서 사용됨
Client 서버에 접속하여 플레이하는 일반 클라이언트

3. 주요 클래스와 역할

멀티플레이어 환경에서는 Gameplay Framework가 각 클래스의 역할을 결정합니다.

클래스 위치 역할

GameMode 서버 게임의 규칙 및 진행을 관리
GameState 서버 & 클라이언트 게임의 전반적인 상태를 동기화 (점수, 시간 등)
PlayerController 서버 & 해당 클라이언트 플레이어 입력을 처리하고, UI를 조작
Pawn 서버 & 모든 클라이언트 캐릭터의 위치, 애니메이션 등을 동기화

각 클래스는 서버-클라이언트 간 원활한 데이터 처리를 위해 고유한 역할을 수행합니다.


4. Replication과 RPC의 차이

Unreal Engine은 멀티플레이어 환경에서 두 가지 주요 네트워크 통신 방식을 제공합니다.

1️⃣ Replication (상태 동기화)

Replication은 서버에서 클라이언트로 데이터를 자동 동기화하는 방식입니다.

  • 목적: 지속적으로 변하는 게임 상태(위치, 체력 등)를 클라이언트에게 전파
  • 방향: Server → Client (단방향)
  • 특징: 엔진이 자동으로 관리하며, 상태만 동기화하고 이벤트 자체는 전달하지 않음

예제 (Health 상태 동기화):

UPROPERTY(ReplicatedUsing = OnRep_Health)
float Health;

UFUNCTION()
void OnRep_Health();

이렇게 설정하면 서버에서 Health가 변경될 때, 클라이언트에서도 OnRep_Health()가 실행되어 UI를 업데이트할 수 있음.

2️⃣ RPC (Remote Procedure Call, 원격 함수 호출)

RPC는 특정 이벤트가 발생했을 때 원격에서 함수를 실행하는 방식입니다.

RPC 유형 호출 방향 용도

Server RPC Client → Server 문 열기, 공격 요청 등 클라이언트의 액션 전달
Client RPC Server → 특정 Client UI 업데이트, 메시지 표시 등 개인화된 피드백 전달
Multicast RPC Server → 모든 Client 효과음, 파티클 재생 등 전체적인 이벤트 공유

예제 (서버에서 총 발사 처리):

UFUNCTION(Server, Reliable, WithValidation)
void ServerFireWeapon();

이렇게 하면 클라이언트가 ServerFireWeapon()을 호출할 때, 서버에서만 실행됨.


5. Replication vs RPC 정리

방식 사용 목적 자동 처리 여부 이벤트 기반

Replication 상태 동기화 (위치, 체력 등) O X
RPC 특정 동작 실행 (문 열기, 총 쏘기 등) X O

📌 핵심 요약

  • 상태(state)를 동기화할 때는 Replication을 사용
  • 이벤트(event) 기반의 동작은 RPC로 실행
  • 클라이언트는 직접 Replicated 변수를 수정할 수 없고, 항상 Server RPC를 통해 서버에 요청해야 함

이 원칙을 잘 지키면 안정적이고 효율적인 멀티플레이어 게임을 개발할 수 있습니다! 🚀