Network Role

정재훈·2023년 10월 9일
0

Unreal Multiplay

목록 보기
5/7

replication은 멀티 플래이환경에서 데이터를 동기화하고
client와 server사이에 procedure call을 하여 액터를 업데이트함으로서
수많은 client들이 하나의 서버에서 게임을 함께 즐길수 있게 한다.

이때 replication관해서 액터에 중요한 property가 role이다.

Network Role 이란

Server와 Client1, Client2가 같이 게임을 하고있다 가정하자
Client1의 컴퓨터에 Client1이 조종중인 pawn이 있다면
Server에도 Client1이 조종중인 pawn이 있으며
Client2의 컴퓨터에도 Client1이 조종중인 pawn이 있을것이다.

이때 코드에서는 어떤버전의 액터를 다루는지 정확히 구분해줄 필요가 있는데 그때 사용하는 것이 role 이다.

role분류 방식에는 local role과 remote role 두가지가 있다.

Local Role

ENetRole

ENetRole::ROLE_Authority

언리얼은 Authoratative server model을 사용하기때문에 server에 있는 액터는 Authority role을 가진다.
이 액터는 replicate되고 클라이언트는 그저 업데이트를 받아 액터에 시뮬레이션을 적용한다.

  • replication mode : 서버는 대역폭과 리소스 문제로 AActor::NetUpdateFrequency 프로퍼티에 정의된 빈도로 액터를 리플리케이트한다.
    이때 액터 업데이트 사이에 약간의 시간을 보정하기위해 시뮬레이션을 적용한다.

ENetRole::ROLE_SimulatedProxy

내가 조종하고 있지 않는 액터.
표준 시뮬레이션 방법으로 서버가 특정 액터에 대한 업데이트를 전송할때
액터를 그 위치로 조정한다음 업데이트 사이마다 클라이언트는 서버에서
전송된 최근 속도에 따라 액터를 계속 움직인다.

ENetRole::ROLE_AutonoimoiusProxy

내가 조종하고 있는 액터.
컨트롤러의 입력을 받으므로 마지막 알려진 속도를 기반으로 외삽하기 보다는
입력정보를 사용하여 빠진 정보를 채운다.

예시)

Server Computer

  • Server Pawn (Authority)
  • Client1 Pawn (Authority)
  • Client2 Pawn (Authority)

Client1 Computer

  • Server Pawn (SimulatedProxy)
  • Client1 Pawn (AutnomousProxy)
  • Client2 Pawn (SimulatedProxy)

Client2 Computer

  • Server Pawn (SimulatedProxy)
  • Client1 Pawn (SimulatedProxy)
  • Client2 Pawn (AutnomousProxy)

Remote Role

서버가 아닌 입장에서 서버에서의 role이 remote role이다.
local role과 반대라 생각하면 편하다.

예시)

Server Computer

  • Server Pawn (AutnomousProxy)
  • Client1 Pawn (SimulatedProxy)
  • Client2 Pawn (SimulatedProxy)

Client1 Computer

  • Server Pawn (Authority)
  • Client1 Pawn (Authority)
  • Client2 Pawn (Authority)

Client2 Computer

  • Server Pawn (Authority)
  • Client1 Pawn (Authority)
  • Client2 Pawn (Authority)

코드 예시

OverheadWidget.cpp

void UOverheadWidget::ShowPlayerNetRole(APawn* InPawn)
{
	ENetRole LocalRole = InPawn->GetLocalRole();
	FString Role;
	switch (LocalRole)
	{
	case ENetRole::ROLE_Authority:
		Role = FString("Authority");
		break;
	case ENetRole::ROLE_AutonomousProxy:
		Role = FString("Autonomous Proxy");
		break;
	case ENetRole::ROLE_SimulatedProxy:
		Role = FString("Simulated Proxy");
		break;
	case ENetRole::ROLE_None:
		Role = FString("None");
		break;
	}
	FString LocalRoleString = FString::Printf(TEXT("Local Role: %s"), *Role);
	SetDisplayText(LocalRoleString);
}

캐릭터위에 ui텍스트를 local role마다 다르게 설정해주는 함수이다.
client1의 컴퓨터에서는 아래 사진과 같은 캐릭터위에 텍스트를 얻게 될것이다.

profile
게임 개발 공부중!

0개의 댓글