RPC 세부 사항들

Remote Procedure Calls (RPCs)은 원거리 머신의 함수를 부를 수 있게 해줍니다. RPC는 일반적인 함수를 부르는 것과 유사하며 매우 쉽습니다. 그러나, 이해해야 할 중요한 차이점들이 있습니다.

  1. RPC 호출은 원하는 만큼의 매개 변수를 가질 수 있습니다. 모든 매개 변수들은 네트워크를 통해서 보내집니다. 더 많은 매개 변수를 보낼수록 정보량 또는 대역폭이 증가합니다. 그러므로, 가능한 매개 변수들을 최소화 하도록 노력해야 합니다.

#보내지는 RPC를 누가 받을 지 결정할 필요가 있습니다. 몇몇 RPC 호출 모드가 있으며, 공통의 사용 경우들을 포함합니다. 모두에게, 또는 특정 서버, 특정 클라이언트/플레이어에게 RPC 함수를 쉽게 호출 할 수 있습니다.

RPC 호출들은 게임에서 모든 클라이언트들의 특정한 이벤트를 수행하는데 주로 사용됩니다. 또는, 두 개체들 사이에 이벤트 정보를 전달하는데도 사용됩니다. RPC 호출을 창의적으로 사용하여 원하는 경우에 사용할 수가 있습니다. 예를 들어, 4 클라이언트들이 접속한 후에 시작하는 게임을 위한 서버는 네 번째 클라이언트가 접속하자 마자RPC 호출을 모든 클라이언트에게 하여 게임을 시작 할 수 있습니다. 클라이언트는 자신이 아이템을 얻었다는 신호를 보내기 위해RPC 호출들을 모두에게 보낼 수 있습니다. 서버는 RPC를 특정 클라이언트에게만 보낼 수 있습니다. 이는, 예를 들면, 클라이언트가 접속한 후, 플레이어 넘버를 부여하고, 위치를 복사 생성 시키고, 팀의 색상 등을 주기 위함입니다. 클라이언트는 시작 옵션(선호 색상, 구입한 아이템들)을 명시하기 위해서RPC를 서버에게만 보낼 수 있습니다

RPCs들 사용

RPC 호출들을 수립하는 데는 두 단계가 관여됩니다: 호출을 원하는 함수 선언과 호출. 함수를 선언 할 때는 RPC 속성(attribute)을 함수에 앞에 부착해야 합니다.

다음 코드는 RPC 함수를 선언합니다.

// All RPC calls need the @RPC attribute!
@RPC
function PrintText (text : String)
{
    Debug.Log(text);
}

일단 RPC 호출을 선언한 후, RPC를 호출 할 수 있습니다. 모든 네트워크 통신은 (스크립트로서 같은 게임오브젝트에 부착된) 네트워크 보기를 통하여 이루어 집니다. 즉, RPC 함수들을 포함하는 스크립트들을 네트워크 보기 컴포넌트를 포함하는 게임오브젝트에 부착할 필요가 있습니다.

RPC들에는 다음과 같은 변수 타입들을 매개 변수들에 사용할 수 있습니다:

  • int
  • float
  • string
  • NetworkPlayer
  • NetworkViewID
  • Vector3
  • Quaternion

다음 코드는 RPC 함수를 호출합니다.

networkView.RPC ("PrintText", RPCMode.All, "Hello world");

이 코드는 (같은 게임오브젝트에 부착된 어떤 스크립트 안에서의) 모든 "PrintText()" 함수들을 호출하기 위해서 부착된 네트워크 보기를 사용할 것입니다.

RPC()의 첫 번째 매개 변수는 호출할 함수의 이름입니다. 두 번째 매개 변수는 누가 이 함수를 호출 할 것인가를 정합니다. 이 경우, 서버에 접속한 모두에게 RPC 호출을 하지만, 서버에게 나중에 접속할 클라이언트들을 위한 호출을 버퍼(buffer) 하라고는 말하지 않았습니다.

모든 다음의 매개 변수들은 RPC 함수에게 전해질 매개 변수들이며, 네트워크를 통해 보내집니다. 이 경우, "Hello World"는 매개 변수로서 보내지고, PrintText 함수의 텍스트 매개 변수로 건네어집니다.

추가적인 내부 매개 변수를 보유할 수 있습니다. NetworkMessageInfo 구조체는 누가 RPC를 보내었는가와 같은 세부 사항을 보유할 수 있습니다. 이 정보는 구체적으로 전달해야 할 필요는 없습니다. 예를 들어, 위의PrintText 함수는 똑같이 호출되지만, 다음 과 같이 선언될 수 있습니다:

@RPC
function PrintText (text : String, info : NetworkMessageInfo)
{
    Debug.Log(text + " from " + info.sender);
}

이미 언급한대로, 스크립트에서 RPC함수가 동작하려면, 네트워크 보기가 해당 스크립트를 보유한 게임오브젝트에 존재해야 합니다. 같은 네트워크 보기로 상태 동기화를 사용하지 않으면, 네트워크 보기의 State SynchronizationOff으로 설정 될 수 있습니다.

RPC Buffer

RPC 호출들은 버퍼 될 수 있습니다. 버퍼 된 RPC 호출들은 저장되고, 새로운 접속 클라이언트들을 위하여 수행될 수 있습니다. 이미 존재하는 이전의 게임 세션에 참여하는 플레이어의 프로세스를 만드는데 유용합니다. 일반적인 시나리오는 게임에 참여하는 모든 플레이어가 특정 레벨을 로드(load) 하는 것입니다. 따라서, RPC 함수를 모두에게 보내고, 버퍼 될 것이라고 설정합니다. RPC를 버퍼 함으로서, 새로운 플레이어가 참여할 때마다, RPC 가 플레이어에게 자동으로 보내집니다. 이 방법으로, 모든 플레이어의 게임 참여를 수동으로 추적 해야 할 필요가 없으며, 플레이어에게 로드 레벨 RPC(load level RPC)를 구체적으로 보낼 필요가 없습니다.

유니티는RPC 버퍼로부터 몇몇 호출을 제거할 수 있는 기능을 가집니다. 로드 레벨의 예에서는, 다중 레벨로 게임이 진행되면, 신경 써야 할 모든 것들은 현재의 레벨에 참여하는 새로운 플레이어입니다. 이 경우, RPC 버퍼로부터 이전에 추가된 로드 레벨 RPC 호출들을 제거할 수 있습니다.

역링크