Unreal Engine, Network Architecture 이해
언리얼 엔진 멀티 플레이어은 C/S 방식의 네트워크를 사용한다.
그리고 언리얼 엔진에서 지원하는 네트워크 방식은 크게 3개를 제공하고 있다.
세개의 네트워크 방식
- 로컬 멀티플레이어 게임: Play As Standalong 이름으로 언리얼 엔진에서 테스트할 수 있다. 멀티플레이어는 다이렉트로 연결하여 게임을 연결한다. .
- P2P Centralized: Play As Listen Server 이름으로 언리얼 엔진에서 테스트 할 수 있다. 원격으로 멀티플레이어들 게임 세션에 조인한다. 그리고 클라이언트끼리 서로 통신하고 한명을 Host 역할을 한다.
- Dedicated Server: Play As Client 이름으로 언리얼 엔진에서 테스트할 수 있다. Dedicated Server는 백그라운드로 동작하며 언리얼 게임의 Client는 Dedi 서버가 생성한 세션에 접근하여 통신한다.
RPC (Remote Procedure Calls)
네트워크 플레이어끼리 연결하면 속도와 통신이 불안정하다. Host Server는 불안정한 각각 다른 화면을 보고 있는 클라이언트들에게 교통 정리를 해주도록 한다.
또한 클라이언트는 함수를 실행할 때 RPC 라는 힌트가 있으면 서버에게 전달하는 기능이 있다. 전달받은 서버는 함수가 맞는지 확인하고 계산하도록 한다.
Replicated 와 함께 많이 사용하는 함수이다.
네트워크 구현시 주의사항
그리고 네트워크 통신을 구현할 때 각각의 서버와 플레이어들이 보고 있는 화면은 다르기 때문에 늘 주의하며 구현해야한다.
- 인겜을 담당하는 서버(권력자)
- 플레이어1
- 플레이어2
- 플레이어3, 관전자 등등
넷모드
넷모드는 언리얼에서 제공하는 네트워크 모드이다. 인수값으로 사용하는 열거형은 다음과 같은 순서로 되어있다.
ENetMode
- NM_Standalone
- NM_DedicatedServer
- NM_ListenServer
- NM_NMClient
온라인게임은 DedicatedServer, Client 역할이 중요하고 서버가 모든 데이터를 Replicated 통해 플레이어들에게 전달할 수 없다. 상호작용에 대한 사용은 서버와 클라이언트가 나누어주어야 한다.
대표적인 게임 상호작용
- 플레이어 충돌, 이동, 피격
- 이펙트 비주얼, 사운드
- 플레이어 화면 HUD 업데이트
Replicated
데디서버가 연결된 클라이언트에게 전달하는 상태 정보를 Replicated 라고 한다. Replicated 받은 클라이언트는 소리를 발생하거나, 이펙트를 발생시키도록 한다. 그리고 모든 플레이어들을 같은 화면으로 싱크를 맞춰주도록 한다.
Replicated로 전달되는 대표적인 데이터
- Actor들의 위치
- Actor의 행동
- 변수의 값
Actor Replicated
네트워크 흐름 개발 매커니즘 중 3개가 있다.
Replicated Using Properties 또는 Replicated Properties
특정 액터 속성을 지정하면 관찰 대상이 되어 모든 플레이어에게 정보가 전달된다.
코드로 살펴보면 uint32 Health
라는 속성이 있는데, 체력 용도이고 만약 체력이 깍이면 모든플레이어에게 알려야하는 네트워크 설계가 필요하다. 놀랍게도 UPROPERTY(Replicated)
코드만 추가해도 체력이 변경되면 Replicated 를 통해 모든 플레이어에게 내 체력을 알려주게 된다.
public:
UPROPERTY(Replicated)
uint32 health
Replicated Using Properties 는 전파할때 특정 함수를 전달하는 역할을 한다. 코드는 다음과 같이 작성한다. UPROPERTY(ReplicatedUsing=OnRep_HealUpdate)
속성Health가 변경되면 OnRep_HealUpdate 함수를 실행하도록 한다.
Remote Procedure Calls
원격으로 함수를 호출하는 기능이다. 클라이언트에게 서버에게 함수를 요청하기도 하고 또는 클라이언트가 서버에게 Replicate를 요청하도록 할 수 있게 한다.
주 사용 용도는 인게임에서 예상되지 않는 행동을 RPC로 구현한다.
- Notice 알림
- 플레이어 보이스
- 애니메이션