[Unreal]Introduction & Recap

칼든개구리·2025년 3월 20일
0
post-thumbnail

📕Server-Client 모델과 인스턴스 실행 모드

Server-Client 모델

Unreal Engine은 멀티플레이어 게임에서 Server-Client 구조를 사용합니다.

이는 Server로 정의된 인스턴스가 게임의 상태에 대한 Authority을 가지며, 다른 모든 인스턴스는 Server로부터 업데이트를 받는 Client 임을 의미합니다.

Client들끼리는 직접 통신하지 않고, Client가 취하는 모든 행동(e.g. 캐릭터 이동, 발사 등)은 먼저 Server로 전송되고, Server가 이를 검증한 후 그 결과를 다시 Client들에게 Broadcast 합니다.

Server는 게임의 진정한 상태를 유지하며 모든 최종 결정을 내립니다.
이런 모델을 유지하는 핵심 이유는 일관성을 유지하고 Cheat를 방지하기 위해서이며,
“Never Trust the Client”라는 보편적인 원칙으로 요약됩니다.

Unreal Engine에서는 이러한 Server-Client 구조와 관련하여 여러 실행 모드를 지원하며, 이를 정확히 구분하는 것이 중요합니다.


📕Gameplay Framework

Unreal의 Gameplay Framework는 멀티플레이어 게임에서 각 Class가 어떤 인스턴스(Server/Client)에 존재하는지 정의합니다

GameMode: 존재위치: server, 역할: 게임 규칙 제어
GameState 존재위치: server와 모든 client, 역할:게임의 전체적인 정보(점수,시간) 동기화
PlayerController: 존재위치: server와 자신을 소유한 client, 역할: 각 플레이어 입력은 자기 client와 server에만 알 수 있음
Pawn: 존재위치: server와 모든 client, 역할: 모든 플레이어가 자신 외의 pawn도 볼 수 있도록 server에 Replicate

📌Server-Client 상호작용

이러한 역할 분담을 통해 Server가 Gameplay에 관련된 결정에 독점적인 권한을 갖고, Client는 그에 따른 결과를 보여주며 입력을 Server에 보내는 구조를 명확히 합니다.

예를 들어 Client에서 Pawn을 이동할 때, 입력 즉시 Pawn의 움직임을 예측 후 반영하여 실시간성을 확보합니다. 그리고 동시에 이동 요청을 Server로 보냅니다

Server는 그 요청을 받아 권한 있는 위치에서 캐릭터를 움직이고, 그 새로운 위치/상태를 모든 Client에게 Broadcast 합니다. (Client 자신도 포함)

만약 Client의 자체적인 예측이 정확했다면, 수정할 것이 없으니 부드럽게 플레이됩니다.
만약 차이가 있었다면, Server의 업데이트가 당신 캐릭터의 위치를 조정할 것입니다. (이 조정 과정은 나중에 다룰 “보정(Reconciliation)”의 일부입니다).

핵심은 항상 Server의 상태가 최종으로 신뢰하는 값이라는 겁니다.


📕Replication과 RPC의 차이

Unreal Engine 멀티플레이어 통신

Unreal에서 Server-Client 간 통신을 위한 두 가지 핵심 메커니즘이 ReplicationRPC(Remote Procedure Call)입니다. 이들은 목적과 동작이 다르므로 구분해서 이해해야 합니다.

📝Replication

Replication은 Server에서 Client로 객체 상태를 자동 동기화해주는 기능입니다.
어떤 PropertyActorReplicates = true로 설정하면, Engine의 네트워킹 시스템이 주기적으로 해당 데이터를 관련된 Client들에게 보냅니다.
별도로 코드를 쓰지 않아도 Engine이 지속적으로 상태를 맞춰주는 것이죠.
이는 캐릭터의 위치, 체력, 문이 열렸는지/닫혔는지 등 계속 변할 수 있는 상태를 동기화하는데 적합합니다.

⭐중요⭐: Replication은 단방향입니다. Server -> Client로만 갑니다.
Client에서 Server로 Property를 Replicate 할 수는 없습니다. Client가 어떤 권한 있는 정보를 바꾸고 싶다면, 직접 바꾸는 대신 Server에 요청을 해야 합니다(e.g. RPC).
또한 Replication은 보통 State 기반이어서, Property의 현재 값을 보내지 “변경 Event” 자체를 보내지는 않습니다 (다만 RepNotify 등을 통해 값 변경 시점을 포착할 수 있습니다).

📝RPC (Remote Procedure Call)

RPC (Remote Procedure Call)는 원격 머신에서 함수를 호출하는 명시적인 방법입니다.
Unreal에서 RPC는 UFUNCTIONServer, Client, NetMulticast 같은 지정자를 붙여 만들며, 이를 호출하면 설정된 대상(Server 또는 Client들)에서 함수가 실행됩니다.

예를 들어, Client에서 “FireWeapon”이라는 Server RPC를 호출하면, 그 함수가 Server 측에서 실행되어 총알 발사 처리를 합니다. Replication이 상태를 지속적으로 동기화하는 것이라면, RPC는 특정 순간에 실행되는 동작/Event를 원격으로 호출하는 것입니다.

📕주요 차이 및 활용 상황

📌데이터 흐름 방향

  • Replication은 Server → Client 단방향 자동 동기화
  • RPC는 아래와 같이 종류에 따라 방향 지정 가능

📌State vs Event
일반적으론 지속적인 상태의 동기화에는 Replication된 Property를 사용하고, 일회성 Event와 같을 때 RPC를 사용합니다.

예를 들어 FPS 게임에서 플레이어의 총알 갯수는 (계속 변할 수 있고 현재 값을 유지해야 하는 정보)은 Replicated Property로 만들고, 플레이어가 총을 쐈다는 행위는 RPC로 Server에 보내는 식입니다.

📌Automatic vs Manual
Replication은 Unreal Engine이 알아서 (프레임마다 혹은 필요한 시점마다) 값을 보내주며 내부적으로 최적화됩니다.

RPC는 개발자가 필요한 순간에 직접 호출해야 하고, 호출할 때마다 네트워크 Packet을 생성합니다 .

📌순서와 Reliability

여러 변수의 Replication은 한 번에 뭉쳐서 보내지고, 특정 순서를 보장하지 않습니다.

RPC는 Reliable로 보낼지 Unreliable로 보낼지 선택할 수 있는데, 같은 종류의 RPC들끼리는 호출 순서가 보장됩니다.

profile
메타쏭이

0개의 댓글