언리얼 엔진 - 네트워크 서버 구별 실습

언리얼 엔진에서 네트워크 모드가 클라이언트인지 서버인지 구별이 어려울 수 있다.
몇 가지 방법을 실습을 통해 알아보자

프로젝트는 ThirdPerson 한글로 삼인칭을 선택해 시작한다.

  • BP_ThirdPersonCharacter 블루프린트를 오픈한다.
  • 첫 노드로 BeginPlay 노드를 추가한다.

  • Print String 문자열 노드를 추가한다.
  • BeginPlay 연결하고 In String 부분에 입력하고 싶은 문자열을 기입한다.

  • 플레이에는 플레이어3명 Play As Listen Server로 선택해 구동한다.

  • 플레이하면 많은 채팅이 발생한다.
    • 총 Client1 3개, Client2 3개, Server 3개 출력한다. 각자의 화면에서 Pawn이 스폰한 갯수이다.

보다시피 Client1,Client2,Server 구별 없이 문자가 출력되는데, 네트워크 모드로 머신을 구별하고 특정 머신에서만 문자가 출력되도록 할 것이다.


서버 구별 코드가 필요한 이유

Server에서 바로 메시지를 출력하는 방법은 GameMode 클래스만 로직을 만들어주면 된다.

하지만 GameMode 클래스만 있는 것이 아니기에 Pawn, State, PlayerController 클래스 자유자재로 원하는 클라이언트 또는 서버를 구별해 작성하는 것이 필수이다.


넷모드

넷모드는 실행하고 있는 월드가 서버, 클라이언트인지 판별해주는 모드이다.

C++ 에서는 넷모드를 불려올 수 있으나, 블루프린트는 IsServer 노드로 사용해야한다.

  • IsSever, Branch 노드를 불려와 다음과 같이 Branch 결과에 따라 서버인지 클라이언트인지 구별한다.

  • 게임을 플레이한 경우 Client, Server 를 구별해서 메시지를 출력하는 것을 볼 수 있다.

Authority

Authority 방법으로 서버 클라를 구분하는 노드가 있다.

  • Has Authority, Switch Has Authority 두개가 있다.
  • Has Authority는 Branch 와 함께 사용해야한다.

  • Has Autorith 노드는 Condition 으로 연결
    • Switch Has Authority 는 분기문(Branch) 이 이미 내장되어 있는 노드이다. 둘 중 하나 편한걸로 연결하면 된다.

Has Authority 용도

NetMode 와의 차이점은 Has Authority 는 권한을 부여 받은 것이며, true 환경이 서버라는 뜻이다.
예외적으로 외형 관련 코스메틱 클래스나 이펙트 클래스인 경우 true가 클라이언트여야 한다.


Role - 역할

마지막으로 Role 관련 함수를 사용하는 것이다.

  • GetLocalRole
  • GetRemoteRole

GetLocalRole

자신의 액터에 대한 로컬 권한이 무엇인지 물어보는 것이다.

  • Switch 문과 연결하면 ENetRole Enum 순대로 펼쳐진다.
  • ENetRole 에서 Authority 는 서버로 판단할 수 있고, ...Proxy 끝나는 것은 클라이언트로 판단한다.

다른 네트워크에 비해 Role 역할은 세세한 설정이 가능하다.

  • Simulated Proxy
    • 상대방 액터를 가리키며 시뮬레이션 대상이다.
  • Autonomous Proxy
    • 플레이어가 직접 조종하는 액터이다.