[UE4] Network

윤정민·2022년 9월 2일
0

Unreal Engine

목록 보기
17/34

0. Network 종류

(1) Peer-to-Peer

  • 각각의 client가 서로 연결되어 있다.
  • client의 입력 값을 다른 client들에게 브로드캐스트 하여 state를 update한다.
  • 모두의 응답이 돌아와야 state이 계속 update되기 때문에 네트워크 연결적으로 느린 client가 하나라도 있다면 매우 느린게임이 된다.
  • client가 거짓된 정보를 전송할 수 있으므로 보안또한 문제이다.

(2) Client-Server (UE4 사용)

  • 모든 client가 server에 연결되어 있다.
  • client가 입력을 하면 server에 전송되어 server의 상태를 업데이트한다.
  • 변경된 상태를 client들에게 전송한다.

1. 개요

UE4 네트워크는 서버/클라이언트 모델을 기준으로 만들어졌다. 모든 중요한 결정을 내리는 역할을 하는 서버가 하나있고, 거기에 접속된 모든 클라이언트가 서버의 월드 최신 상태를 유지할 수 있게끔 지속적으로 업데이트시켜 주는 것이다.
UE에서는 네트워크가 아닌 싱글 플레이 게임에도 서버가 있으며, 그 경우 로컬 머신이 서버 역할을 한다.

(1) 네트워크 모드

  • NM_Standalone : 로컬 머신에서 실행되며 원격 머신에서 클라이언트를 받지 않는 서버(로컬게임)
  • NM_DedicatedServer : 로컬 플레이어가 없는 서버 (경쟁게임, ex. battle ground)
  • NM_ListenServer : 로컬 플레이어가 있는 서버 (협력게임, ex. Don't Starve)
  • NM_Client : 서버가 아닌 모드. 데디케이티드 또는 리슨 서버로 접속되는 클라이언트

(2) 네트워크 연결 시퀀스

1) Server

  • GameMode : Game Play Flow 담당
  • GameState : 각 Client에게 Replicate 되도록 마킹되어 있음

2) 정보 이동 Flow

(3) State이 update되는 방식

  • State : actor의 위치, 움직임, 생성 유무 등
  • State#1 + Action => State#2
  • State의 update는 tick 단위로 이루어진다.

(4) 멀티플레이의 액터

싱글 플레이어 게임에서 액터는 게임 월드를 표현하는 데 사용된다. 멀티플레이 게임에서도 이는 다르지 않지만, 클라이언트는 각 액터를 추정해서 표현하는 반면, 서버에는 권위적인 버전이 유지된다.

서버가 클라이언트의 최신 상태를 유지하기 위해 주로 사용하는 것은 액터이다. 서버가 특정 클라이언트를 업데이트할 때가 되면, 서버는 지난번 업데이트 이후 변경되었다고 보는 연관 액터 전부를 수집한 다음, 해당 액터의 최신 상태를 유지하기에 충분할 만큼의 정보를 클라이언트에 전송한다.

(5) 권위적인 Server?

  • 파란 박스가 있고 이를 움직이려한다.
  • 서버 호출& 클라이언트 실행 : 서버와 클라이언트 모두에서 박스가 움직인다.
  • 서버 실행 : 서버에서만 박스가 움직힌다.
    • 클라이언트에서 캐릭터는 파란박스를 통과할 수 있다.
  • 클라이언트 실행 : 클라이언트에서만 박스가 움직인다.
    • 클라이언트에서 원래 박스가 있던 자리에 무언가 막힌것 처럼 지나가지 못한다.
    • 클라이언트에서 움직이는 박스를 통과할 수 있다.

2. Replication

(1) Actor Replication

리플리케이션의 중심은 액터이다. 서버는 액터 목록을 유지하고 클라이언트에서 각 액터에 대한 근접 추정치를 유지할 수 있도록 클라이언트를 주기적으로 업데이트한다.
액터 업데이트 방식은 두가지가 있다.

1) 프로퍼티 업데이트

  • 프로퍼티는 변경될 때마다 자동으로 리플리케이트 된다.(ex. Healt Point)
  • 항상 값을 감시하기 때문에 비용이 존재한다.(마치 tick()에서 isChange라는 bool 변수를 검사하는것와 같다.)
  • 리플리케이션용 프로퍼티 구성
    • UPROPERTYreplicated키워드를 넣어줘야 함
    class ENGINE_API AActor : public UObject
    {
        UPROPERTY( replicated )
        AActor * Owner;
    };
    • GetLifetimeReplicatedProps 함수 구현& DROPLIFETIME설정
    void AActor::GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const
    {
        DOREPLIFETIME( AActor, Owner );
    }
    • 액터 생성자에서 bReplicates = true; 설정

2) RPC(Remote Procedure Call)

  • 실행한 로컬을 제외한 다른 머신에서 원격실행된다.
  • 실행될 때만 리플리케이트 된다.
  • 프로퍼티보다 자주 일어나지 않을 상황에서 사용된다.
  • 휘발성인 비신뢰성 게임플레이 이벤트에 적합하다.
  • 함수를 RPC로 선언하려면 UFUNCTION 선언에 Server,Client, NetMulticast키워드를 붙여주기만 하면 된다.
  • 정상 작동을 위해 아래의 몇가지 충족요건이 필요하다.
    • 액터에서 호출되어야 한다.
    • 액터는 반드시 Replicated여야 한다.
    • 서버에서 호출되고 클라이언트에서 실행되는 경우 해당 액터를 소유한 클라이언트에서만 함수가 실행된다.

(2) Component Replication

컴포넌트는 소유 중인 액터의 일부로 리플리케이트되며, 액터와 같은 방식으로 프로퍼티와 RPC 리플리케이션이 가능하다.

profile
그냥 하자

0개의 댓글