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