언리얼 엔진 - Network 환경 구별하기
언리얼 엔진의 네트워크 코드는 백엔드, 클라이언트 구별 없이 하나의 소스에서 만들어지므로 서버 구분을 해주는 것이 중요하다.
Enum - ENetMode
앞의 E은 Enum의 약자이다.
현재 게임이 네트워크 모드가 어떻게 동작하는지 구별하는 코드이다.
ENetMode
- NM_Standalone
- NM_DedicatedServer
- NM_ListenServer
- NM_Client
NetMode 에서 총 4개가 있으며 서로의 네트워크 환경이 다르다.
NM_Standalone
현재 머신이 싱글 게임이라는 것을 나타낸다.
NM_DedicatedServer
현재 머신이 데디케이트 서버로 나타낸다.
NM_ListenServer
현재 머신이 리스텐 서버로 나타낸다.
NM_Client
현재 머신이 클라이언트으로 나타낸다.
HasAuthority()
Enum 이외의 현재 머신이 서버인지 클라이언트인지 구별하는 Authority 함수가 있다.
Actor의 코드를 최종 판정 권한쪽으로 실행해야하는 상황이 많다.
예를 들어 액터를 레벨맵에서 스폰하거나 디스폰하는 경우이다.
이 경우 최종 권한을 부여된 서버쪽에서 실행해야 한다.
관련 함수
- HasAuthority()
- 리턴은 boolean 타입으로 true인 경우 권한을 갖고 있다는 뜻이다. (내가 서버임)
하지만 간혹 액터의 스폰과 디스폰을 클라이언트에서 처리해주어야 하는 것이 있는데.
서버 자체에서 시뮬레이션할 필요가 없는 코스메틱 관련 액터이다.
즉 서버가 시뮬레이션이 불필요한 액터라면 스폰, 디스폰 권한을 서버가 가질 필요는 없다. (선택 사항)
Enum - ENetRole
ENetRole 종류
- ROLE_SimulatedProxy
- ROLE_AutonouseProxy
- ROLE_Authority
NetRole은 단순하게 액터의 Authority 를 소유하고 있는지 물어보는 것이다.
참인 경우 서버(Authority)이고, 거짓인 경우 클라이언트(Proxy)이다.
서버 입장에서의 원본 권한을 갖고 있는 액터이므로 Authority 를 갖고 있는 것이고,
클라이언트 입장에서는 권한 없는 시뮬레이션 액터이므로 Proxy이다.
- Authority
- 서버에서 플레이어 액터를 가리킨다.
- Proxy
- 클라이언트에서 로컬 플레이어로 액터를 가리킨다.
클라이언트에서 입장에서의 Proxy는 두 종류가 있다.
- Autonomous Proxy
- 로컬 플레이어가 직접 조종하는 조종하는 액터를 가리킨다.
- Simulated Proxy
- 로컬 플레이어가 조종하지 않는 상대방 액터를 가리킨다.
이렇게 세부적으로 나누어진 이유는 액터 중 플레이어가 직접 컨트롤 하는 액터가 무엇인지 알 필요가 있기 때문이다.
로컬 플레이어가 클라이언트 상에서 직접 조종하는 액터는 Autonomous Proxy 액터이다. 나머지는 모두 Simulated Proxy의 액터라고 결론 지을 수 있다.
NetRole로 현재 내가 맡고 있는 액터가 어떠한 역할이 무엇인지 알 수 있다.
그리고 NetRole 판별을 위한 두 가지 함수를 제공하고 있다.
이 함수에 대한 사전 지식으로 자신의 머신이 클라이언트, 서버인지 알고 있어야 한다.
GetLocalRole()
- 내가 실행하는 머신(클라이언트)에서 자신의 액터가 어떤 것인지를 반환한다.
- 자신의 액터이므로 호출 시 Authnomous Proxy 이다.
GetRemoteRole()
- 내가 실행하는 머신(클라이언트)에서 자신의 액터가 어떤 것인지 반환한다.
- 자신의 액터가 상대방(서버)에게는 어떤 NetRole인지 물어보는 것이므로 Authority 로 반환한다.
- 만약 머신이 서버라면 액터의 상대방 입장이 되므로 Proxy로 반환한다.
정리
소스 하나에서 네트워크가 클라이언트 코드와 서버 코드로 구분되므로 작업이 헷갈릴 수 있으니 정리한 ENetMode, HasAuthority, ENetRole 이용하여 소스에서 구분될 수 있도록 해주자.