Version: 2017.1
Обзор сети (Network View)
Сведения о State Synchronization

Сведения о RPC

(For new projects, you should use the new networking system introduced in 5.1. This information is for legacy projects using the old networking system.)

Remote Procedure Calls (RPCs, удаленные вызовы процедур) позволяют вызывать функции на удаленной машине. Вызов RPC подобен вызовы обычной функции и практически также прост, но есть некоторые важные отличия, которые необходимо понимать.

  1. Вызов RPC может иметь столько параметров, сколько вы пожелаете, однако соответствующий сетевой трафик будет возрастать с увеличением числа и размера параметров. Для достижения наилучшего исполнения игры, следует минимизировать параметры.

  2. В отличие от обычного вызова функции, 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# script example

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

JS script example

Все сетевые взаимодействия делаются при помощи компонента NetworkView, так что вам надо прикреплять его к объектам, перед тем как вызывать их скрипты с объявленными как RPC функциями.

Параметры

В качестве параметров RPC вы можете использовать следующие типы переменных:-

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

Например, следующий код вызывает RPC функцию с одним параметром типа string:-

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# script example

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

JS script example

Первый параметр 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# script example

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

JS script example

…в то время, как вызывается тем же способом, что и ранее.

Как уже упоминалось, компонент Network View должен быть прикреплен к любому объекту GameObject, который имеет скрипт, содержащий RPC функции. Если вы пользуетесь только RPC (т.е. не используете синхронизацию состояний State Synchronization), то в компоненте Network View можно выставить параметр State Synchronization в положение Off.

RPC Buffer

Вызовы RPC также могут быть помещены в буфер. Помещенные в буфер вызовы RPC заполняют его и для каждого нового подключившегося клиента выполняются в том порядке, в каком они вызывались. Это может быть полезно, чтобы обеспечить подключающимся позже игрокам при старте всю необходимую информацию. Обычно, каждый подключающийся к игре игрок должен для начала загрузить заданный уровень. Вы можете отправлять подробности об этом уровне всем подключенным игрокам, но также можете помещать их в буфер для тех, кто подключится в будущем. Поступая таким образом, вы обеспечиваете новым игрокам всю информацию об уровне, как будто бы они присутствовали с самого старта.

При необходимости, вы также можете удалять вызовы из буфера RPC buffer. Возвращаясь к примеру выше, в игре мог поменяться уровень со стартового к моменту, когда подключился новый игрок, так что вы можете убрать исходные RPC из буфера и отправить новые с запросом на новый игровой уровень.

Обзор сети (Network View)
Сведения о State Synchronization