(새 프로젝트에는 5.1에서 도입된 새로운 네트워킹 시스템을 사용해야 합니다. 다음 내용은 이전 네트워킹 시스템을 사용하는 레거시 프로젝트를 대상으로 작성되었습니다.)
원격 프로시저 호출(RPC, Remote Procedure Calls) 은 원격 컴퓨터에서 함수를 호출하기 위해 사용할 수 있습니다. RPC 호출은 일반 함수 호출과 유사하고 일반 함수만큼 간편하지만, 중요한 차이점 몇 가지를 이해해야 합니다.
RPC 호출에는 파라미터가 원하는 수만큼 포함될 수 있지만, 관련 네트워크 대역폭이 파라미터 수와 크기에 따라 증가합니다. 최고의 성능을 얻으려면 파라미터를 최소한으로 유지해야 합니다.
RPC에는 일반 함수 호출과 달리 RPC 요청 수신자를 나타내는 추가 파라미터가 필요합니다. 모든 일반적 이용 사례에 적용되는 몇 가지 RPC 호출 모드가 있습니다. 예를 들어, 연결된 모든 컴퓨터에서, 서버에서만, RPC 호출을 전송하는 클라이언트를 제외한 모든 클라이언트에서, 또는 특정 클라이언트에서 RPC 함수를 쉽게 호출할 수 있습니다.
RPC 호출은 일반적으로 게임의 모든 클라이언트에서 이벤트를 실행하거나 특별히 두 당사자 간에 이벤트 정보를 전달하는 데 사용되지만, 원하는 대로 새로운 방식으로 사용할 수도 있습니다. 예를 들어, 네 클라이언트가 연결한 후에만 시작되는 게임의 서버에서는 네 번째 클라이언트가 연결하는 즉시 모든 클라이언트로 RPC 호출을 송신하여 게임을 시작할 수 있습니다. 특정 플레이어의 클라이언트에서는 아이템을 획득했음을 모두에게 알리기 위해 RPC 호출을 보낼 수 있습니다. 서버에서는 RPC를 특정 클라이언트로 보내 연결 즉시 플레이어를 초기화하여 플레이어 번호, 스폰 위치, 팀 컬러 등을 할당할 수 있습니다. 그러면 클라이언트는 선호하는 컬러나 구입한 아이템 같은 시작 옵션을 지정하기 위해 서버로만 RPC를 보낼 수 있습니다.
함수를 원격 호출할 수 있으려면 먼저 RPC로 표시해야 합니다. 이 작업은 스크립트의 함수 앞에 RPC 속성을 추가하여 수행합니다.
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour {
[RPC]
void PrintText (string text)
{
Debug.Log(text);
}
}
C# 스크립트 예제
// All RPC calls need the @RPC attribute!
@RPC
function PrintText (text : String)
{
Debug.Log(text);
}
JS 스크립트 예제
모든 네트워크 통신은 NetworkView 컴포넌트로 처리되므로, RPC 함수를 선언하는 스크립트의 오브젝트에 컴포넌트를 연결한 후에만 호출할 수 있습니다.
다음 변수 타입을 RPC 파라미터로 사용할 수 있습니다.
예를 들어, 다음 코드는 단일 문자열 파라미터가 있는 RPC 함수를 호출합니다.
using UnityEngine;
using UnityEngine.Network;
using System.Collections;
public class ExampleScript : MonoBehaviour {
NetworkView networkView;
void Start() {
networkView = new NetworkView ();
networkView.RPC ("PrintText", RPCMode.All, "Hello world");
}
}
C# 스크립트 예제
networkView.RPC ("PrintText", RPCMode.All, "Hello world");
JS 스크립트 예제
RPC() 의 첫 번째 파라미터는 호출할 함수의 이름이고 두 번째는 함수가 호출될 타겟을 지정합니다. 이 경우에는 서버에 연결된 모든 클라이언트에 대해 RPC 호출을 실행합니다. 하지만 호출은 나중에 연결하는 클라이언트를 기다리기 위해 버퍼링되지 않습니다. 버퍼링에 대한 자세한 내용은 아래를 참조하십시오.
처음 두개 이후의 모든 파라미터는 RPC 함수에 전달되고 네트워크를 통해 전송됩니다. 이 예제에서는 “Hello World”가 파라미터로 전송되고 PrintText 함수에서 텍스트 파라미터로 전달됩니다.
또한 추가 내부 파라미터인 NetworkMessageInfo 구조체에도 액세스할 수 있습니다. 구조체에는 RPC 호출의 발신 위치 같은 추가 정보가 있습니다. 이 정보는 자동으로 전달되므로 위의 PrintText 함수는 다음과 같이 선언될 수 있습니다.
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour {
[RPC]
void PrintText (string text, NetworkMessageInfo info)
{
Debug.Log(text + " from " + info.sender);
}
}
C# 스크립트 예제
@RPC
function PrintText (text : String, info : NetworkMessageInfo)
{
Debug.Log(text + " from " + info.sender);
}
JS 스크립트 예제
…그리고 이전과 동일한 방법으로 호출됩니다.
앞에서도 언급했듯이, RPC 함수가 포함된 스크립트가 있는 게임 오브젝트에 네트워크 뷰를 연결해야 합니다. 상태 동기화 없이 RPC만 사용하는 경우 네트워크 뷰에서 State Synchronization 을 Off 로 설정할 수 있습니다.
RPC 호출을 버퍼링할 수도 있습니다. 버퍼링한 RPC 호출은 연결하는 새 클라이언트에 각각 제공된 순서대로 저장 및 실행됩니다. 이 방법은 늦게 들어오는 플레이어가 시작하는 데 필요한 모든 정보를 얻도록 하는 데 유용합니다. 일반적인 시나리오에서는 게임에 참여하는 모든 플레이어가 특정 레벨을 먼저 로드해야 합니다. 해당 레벨의 세부 사항을 연결된 모든 플레이어에게 보내면서 미래에 참여할 누군가를 위해 버퍼링할 수도 있습니다. 그러면 새 플레이어가 처음부터 게임에 참여했던 것처럼 레벨 정보를 수신하도록 보장됩니다.
필요한 경우 RPC 버퍼에서 호출을 제거할 수도 있습니다. 위의 예제를 보면, 새로운 플레이어가 참여하는 시점에는 게임이 시작 레벨의 다음 레벨까지 진행되었을 수 있으므로 버퍼링된 원래 RPC를 제거하고 새로운 레벨을 요청하는 새 RPC를 전송할 수 있습니다.