replication은 멀티 플래이환경에서 데이터를 동기화하고
client와 server사이에 procedure call을 하여 액터를 업데이트함으로서
수많은 client들이 하나의 서버에서 게임을 함께 즐길수 있게 한다.
이때 replication관해서 액터에 중요한 property가 role이다.
Server와 Client1, Client2가 같이 게임을 하고있다 가정하자
Client1의 컴퓨터에 Client1이 조종중인 pawn이 있다면
Server에도 Client1이 조종중인 pawn이 있으며
Client2의 컴퓨터에도 Client1이 조종중인 pawn이 있을것이다.
이때 코드에서는 어떤버전의 액터를 다루는지 정확히 구분해줄 필요가 있는데 그때 사용하는 것이 role 이다.
role분류 방식에는 local role과 remote role 두가지가 있다.
언리얼은 Authoratative server model을 사용하기때문에 server에 있는 액터는 Authority role을 가진다.
이 액터는 replicate되고 클라이언트는 그저 업데이트를 받아 액터에 시뮬레이션을 적용한다.
내가 조종하고 있지 않는 액터.
표준 시뮬레이션 방법으로 서버가 특정 액터에 대한 업데이트를 전송할때
액터를 그 위치로 조정한다음 업데이트 사이마다 클라이언트는 서버에서
전송된 최근 속도에 따라 액터를 계속 움직인다.
내가 조종하고 있는 액터.
컨트롤러의 입력을 받으므로 마지막 알려진 속도를 기반으로 외삽하기 보다는
입력정보를 사용하여 빠진 정보를 채운다.
서버가 아닌 입장에서 서버에서의 role이 remote role이다.
local role과 반대라 생각하면 편하다.
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의 컴퓨터에서는 아래 사진과 같은 캐릭터위에 텍스트를 얻게 될것이다.