1. 네트워킹 개요

1.리플리케이션(Replication) 개념

 

  • UE에서 클라이언트와 서버 간 데이터 및 절차 호출을 동기화하는 프로세스 ⮕ 같은 게임 상태 유지
  • 멀티플레이 프로젝트에서 다양한 상황을 처리하기 위한 하이 레벨 추상성과 로우 레벨 커스터마이징 제공
    • 하이 레벨 추상성(High-Level Abstraction)
      1. 쉽게 사용할 수 있도록 미리 만들어진 기능
      2. 복잡한 네트워크 처리 없이 기본적인 멀티플레이 기능을 구현 가능
      3. 예: bReplicates(액터의 리플리케이션 활성화), ReplicatedUsing(값이 변경될 때 호출할 함수 지정) 같은 기본 옵션
    • 로우 레벨 커스터마이징(Low-Level Customization)
      1. 개발자가 직접 네트워크 통신 방식을 세밀하게 제어할 수 있는 기능
      2. 기본 제공 기능으로 해결되지 않는 고급 네트워크 처리 가능
      3. 예: RPC(Remote Procedure Call)를 사용한 서버-클라이언트 간 직접적인 데이터 전송, 네트워크 대역폭 최적화 등

 

2. 멀티플레이어 vs. 싱글 플레이어

  • 싱글 플레이어: 모든 정보가 하나의 컴퓨터에 저장됨
  • 멀티플레이어: 게임 스테이트 정보가 네트워크를 통해 여러 컴퓨터 간에 전달됨 → 더 복잡한 프로그래밍 요구됨
  • 플레이어 간 정보 공유는 추가적인 단계와 세심한 주의 필요

 

3. 멀티플레이 기능을 고려한 개발

  • 멀티플레이 가능성이 있다면 처음부터 이를 염두에 두고 개발
  • 초반부터 멀티플레이 지원을 고려하면 개발 과정에서 큰 추가 부담 없이 진행 가능
  • 사전 고려 없이 개발하면 네트워크 환경을 반영한 코드 리팩토링이 필요하며, 기술적 한계로 인해 기존 디자인을 변경해야 할 수도 있음

 

2. 클라이언트-서버 모델

  • 하나의 컴퓨터가 서버가 되어 멀티플레이 세션을 호스팅
  • 서버는 클라이언트와 게임 스테이트 정보를 공유하고 통신 지원

 

 

  • 서버의 역할
    • 서버는 하나의 진정한 오소리티(authority) 있는 게임 스테이트를 보유
    • 멀티플레이어 게임의 실제 실행이 이루어지는 곳
  • 클라이언트의 역할
    • 서버가 소유한 폰(Pawns)을 원격 제어하며, 게임 내 액션을 수행하도록 프로시저 호출 전송
    • 서버는 클라이언트에 직접 영상을 스트리밍하지 않음
  • 리플리케이션 과정
    • 서버는 게임 스테이트 정보를 각 클라이언트에 리플리케이트
    • 존재해야 하는 액터, 액터의 행동 방식, 보유해야 할 변수 값을 클라이언트에 전달
    • 클라이언트는 이를 바탕으로 서버의 게임 상태를 최대한 유사하게 시뮬레이션

 

3. 클라이언트-서버 게임플레이 예시

- 플레이어 1(Player 1) 과 플레이어 2(Player 2)가 서로에게 발사체를 발사하는 프로세스 -

 

  • 무기 발사 프로세스
    • 플레이어 1이 입력하여 무기 발사
    • 로컬 폰 → 서버 폰에 무기 발사 명령 전달
    • 서버에서 발사체 스폰 및 각 클라이언트에 사본 생성 지시
    • 서버가 무기 발사 사운드 및 비주얼 이펙트 재생 지시
  • 발사체 이동 및 충돌
    • 서버에서 발사체 이동 → 각 클라이언트에 이동 정보 리플리케이트
    • 서버에서 발사체가 플레이어 2와 충돌
    • 서버가 발사체 소멸 및 충돌 이펙트 재생 지시
    • 서버에서 플레이어 2의 폰이 대미지 받고, 클라이언트에 반응 이펙트 재생 지시
  • 네트워크 환경에서의 처리
    • 서로 다른 컴퓨터(서버 + 클라이언트)의 월드에서 동일한 이벤트가 발생하는 것처럼 보이게 처리
    • 서버가 클라이언트에 선별적으로 정보 전송하여 시각적 표현 유지
  • 리플리케이션 고려 사항
    • 필수 게임플레이 요소(콜리전, 무브먼트, 대미지)
    • 장식성 이펙트(비주얼, 사운드)
    • 개인 정보(HUD 업데이트)
    • 리플리케이트할 정보를 명확히 지정해야 하며, 네트워크 대역폭 최소화가 중요

 

4. 언리얼 엔진 네트워크 모드(Network Modes)

네트워크 모드는 게임 세션에서 각 기기의 역할을 정의.

네트워크 모드 ENetMode 설명
Standalone NM_Standalone 네트워크 기능 없이 로컬 플레이어만 존재하는 모드. 싱글 플레이 및 로컬 멀티플레이에 사용됨. 서버 기능을 포함하지만 클라이언트 연결은 받지 않음.
Dedicated
Server
NM_DedicatedServer 로컬 플레이어 없이 원격 클라이언트만 연결할 수 있는 서버. 그래픽, 사운드, 입력을 처리하지 않아 성능이 뛰어남. 대규모 멀티플레이어 게임에서 사용됨.
Listen
Server
NM_ListenServer 로컬 플레이어가 있는 서버로, 네트워크의 다른 플레이어가 참여 가능. 설정이 간단하지만 호스트 플레이어가 유리할 수 있음.
Client NM_Client 원격 서버에 연결된 클라이언트. 서버의 명령을 따르며, 자체적인 서버 기능을 수행하지 않음.

네트워크 모드를 확인하려면 GetNetMode() 함수를 사용.

5. 서버 유형(Server Types)

5.1 리슨 서버(Listen Server)

  • 사용자가 직접 서버를 호스팅할 수 있어 설정이 간단함.
  • UI를 통해 서버를 생성하거나 기존 서버를 검색할 수 있음.
  • 단점: 호스트가 서버 역할을 하면서 직접 플레이하기 때문에 다른 클라이언트보다 유리할 수 있으며, 성능 부담이 커질 수 있음.

5.2 전용 서버(Dedicated Server)

  • 서버 전용 기기에서 실행되며, 모든 플레이어가 네트워크를 통해 연결함.
  • 공정한 환경을 보장하고 성능이 뛰어나지만 설정이 복잡하고 비용이 발생할 수 있음.
  • 대규모 멀티플레이어 게임(MMO, MOBA, FPS 등)에 적합함.

'TIL > C++와 UE' 카테고리의 다른 글

Object Pooling  (0) 2025.03.28
언리얼 엔진 레플리케이션(Replication)  (0) 2025.03.11
작성중  (0) 2025.02.26
머티리얼 조작  (0) 2025.02.25
Enemy(Monster) 클래스  (0) 2025.02.24