ENetRole
예를들어, 나랑 상대 둘이 네트워크를 통해 게임을 진행한다.
그러면 내 컴퓨터에 컨트롤 하는 캐릭터,
서버에서 관리하는 캐릭터,
상대 컴퓨터에서 존재하는 내 캐릭터
이렇게 3가지가 존재하게 된다.
이러한 상태에서 각 어떤 캐릭터를 컨트롤해야하는지 살펴보자
ENetRole
- ENetRole::ROLE_SimulatedProxy
- ENetRole::ROLE_AutonomousProxy
- ENetRole::ROLE_Authority
언리얼 엔진의 네트워크 동기화에서는 ENetRole을 사용하여 각 클라이언트와 서버의 캐릭터 역할과 권한을 관리합니다. ENetRole은 네트워크 환경에서 객체의 역할과 동작을 정의하는 중요한 개념으로, 이로 인해 각 캐릭터가 서버와 클라이언트에서 어떻게 동작하는지 설정할 수 있습니다. 예를 들어, 내 컴퓨터에서 컨트롤하는 캐릭터, 서버가 관리하는 캐릭터, 다른 플레이어의 컴퓨터에 존재하는 캐릭터의 동작이 달라질 수 있습니다.
ENetRole의 역할과 종류
ENetRole은 총 4가지 역할로 구분됩니다:
-
ROLE_None:
- 네트워크 권한이 전혀 없는 상태입니다.
- 일반적으로 잘 사용하지 않습니다.
-
ROLE_SimulatedProxy:
- 원격(다른 컴퓨터나 서버)에서 제어하는 객체의 복제본입니다.
- 이 객체는 클라이언트 측에서 실제 물리나 로직을 계산하지 않고 서버의 동작을 따라가며 단순히 모션을 시뮬레이션하는 역할을 합니다.
- 즉, 클라이언트에서 다른 플레이어가 조종하는 캐릭터는 ROLE_SimulatedProxy가 됩니다.
-
ROLE_AutonomousProxy:
- 클라이언트에서 조종하고 있으며 해당 클라이언트에서 로컬로 제어 권한을 가진 객체입니다.
- 클라이언트에서 본인의 캐릭터를 조종할 때 이 역할을 사용합니다.
- 이 역할을 가진 객체는 클라이언트가 입력에 따라 직접 업데이트를 수행하고, 서버와 동기화를 위해 주기적으로 데이터를 전송합니다.
-
ROLE_Authority:
- 서버가 소유하고 제어 권한을 가진 객체입니다.
- 서버는 모든 캐릭터에 대한 절대 권한을 가지고 있으며, 모든 클라이언트에게 권한을 분배하고 동기화합니다.
- 서버에 있는 각 캐릭터는 ROLE_Authority 역할을 가집니다.
캐릭터의 3가지 존재 위치와 역할
ENetRole의 사용 예
예를 들어, 1번 플레이어가 키보드 입력으로 본인의 캐릭터를 움직이면 다음과 같은 흐름이 일어납니다.
-
클라이언트 (1번 플레이어의 컴퓨터):
- 1번 플레이어의 캐릭터는 ROLE_AutonomousProxy이므로, 키 입력에 따른 캐릭터 이동 처리를 먼저 로컬에서 수행합니다.
- 이 입력 정보를 서버로 전송하여 동기화합니다.
-
서버:
- 서버는 모든 캐릭터에 대해 ROLE_Authority를 가지고 있으므로, 클라이언트에서 받은 정보를 바탕으로 1번 플레이어의 캐릭터 위치를 갱신하고 최종적인 상태를 결정합니다.
- 이후 서버는 이 상태를 모든 클라이언트에 전송하여 동기화합니다.
-
다른 클라이언트 (2번 플레이어의 컴퓨터):
- 2번 플레이어의 클라이언트에서는 1번 플레이어의 캐릭터가 ROLE_SimulatedProxy로 존재합니다.
- 2번 플레이어의 클라이언트는 서버에서 받은 데이터를 기반으로 1번 플레이어의 캐릭터를 시뮬레이션하고 화면에 렌더링합니다.
이와 같이, ENetRole은 각 캐릭터의 역할을 정의하고 캐릭터의 존재 위치에 따라 클라이언트와 서버 간의 네트워크 동기화를 관리하게 됩니다.