Version: 2017.1
Network Views
Сведения о RPC

Обзор сети (Network View)

(This class is part of the old networking system and is deprecated. See NetworkIdentity for the new networking system).

Network Views является отправной точкой в создании сетевых многопользовательских игр в Unity. Они просты в использовании, но и также чрезвычайно мощны. Именно по этой причине так важно, чтобы вы поняли фундаментальные принципы работы сети, перед тем как вы начнёте экспериментировать с обозревателями сети. Вы можете изучить фундаментальные принципы в справочном руководстве по сети.

Чтобы использовать сетевые возможности, включая State Synchronization или Remote Procedure Calls, ваш GameObject должен иметь назначенный обозреватель сети.

Свойства

Свойство: Функция:
State Synchronization Тип синхронизации состояний, используемый данным обозревателем сети
        Выключено (Off) Синхронизация состояний не будет использоваться. Наилучший вариант, если вам необходимо отослать только удалённые вызовы процедур
        Выключено (Off) Будет выслана лишь разница между последним и текущим состоянием , если ничего не было изменено, ничего не будет выслано. Данный режим упорядочен. В случае потери пакета, потерянный пакет будет автоматически отправлен заново
        Выключено (Off) Будет выслано завершённое состояние. Требуется большая пропускная способность, зато потери при передаче пакета будут минимальны
Observed Данные Component, которые будут отосланы через сеть
View ID Уникальный идентификатор для данного обозревателя сети. В инспекторе эти значения предназначены только для чтения
        Выключено (Off) Номер идентификатора обозревателя сети данной конкретной сцены
        Выключено (Off) Either saved to the Scene or Allocated at runtime

Детали

При добавлении обозреватели сети к игровому объекту вы должны иметь ввиду две вещи

  1. Какой тип данных вам необходимо отослать обозревателю сети
  2. Как вы хотите отослать эти данные

Выбор данных для отправки

Свойство обозревателя сети Observed может содержать один компонент. Это может быть Transform, Animation, RigidBody или скрипт. Чем бы не был компонент Observed, его данные будут высланы через сеть. Вы можете выбрать компонент из выпадающего списка или перетащить его за заголовок прямо на переменную. Если вам не нужно пересылать данные напрямую, а только использовать вызовы RPC, тогда вы можете отключить синхронизацию (никакие данные не будут отсылаться напрямую) и вам не нужно будет ничего назначать в качестве свойства Observed. RPC необходим всего один обозреватель сети, поэтому вам не нужно добавлять отдельно для RPC свой обозреватель сети.

Как отправлять данные (###How to send the data)

У вас имеются 2 опции для отправки данных Observed компоненту: State Synchronization и Remote Procedure Calls.

To use State Synchronization, set State Synchronization of the Network View to Reliable Delta Compressed or Unreliable. The data of the Observed Component will now be sent across the network automatically.

Reliable Delta Compressed упорядочен. Пакеты всегда принимаются в том порядке, в котором они были высланы. Если передача пакета была нарушена, то пакет будет отправлен вновь. Отсылаться будут только те передачи, между значениями которых есть разница, если же разницы нет, то ничего пересылаться не будет.

Если он следит за скриптом, то вы должны последовательно преобразовать данные внутри скрипта. Сделать это можно в функции OnSerializeNetworkView().

using UnityEngine;
using UnityEngine.Network;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    void OnSerializeNetworkView (BitStream stream, NetworkMessageInfo info) {
        float horizontalInput = Input.GetAxis ("Horizontal");
        stream.Serialize (horizontalInput);
    }
}

C# script example

function OnSerializeNetworkView (stream : BitStream, info : NetworkMessageInfo) {
    var horizontalInput : float = Input.GetAxis ("Horizontal");
    stream.Serialize (horizontalInput);
}

JS script example

Когда получает обновление, вышеупомянутая функция всегда записывает(обновление из потока) в horizontalInput, и в противном случае считывает её из записи переменной в поток. Для получения большей свободы действий во время получения или отправки обновлений вы можете использовать атрибут isWriting в BitStream классе.

using UnityEngine;
using UnityEngine.Network;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    void OnSerializeNetworkView (BitStream stream, NetworkMessageInfo info) {
        float horizontalInput = 0.0;
        if (stream.isWriting) {
            // Sending
            horizontalInput = Input.GetAxis ("Horizontal");
            stream.Serialize (horizontalInput);
        } else {    
            // Receiving
            stream.Serialize (horizontalInput);
            // ... do something meaningful with the received variable
        }
    }
}

C# script example

function OnSerializeNetworkView (stream : BitStream, info : NetworkMessageInfo) {
    var horizontalInput : float = 0.0;
    if (stream.isWriting) {
        // Sending
        horizontalInput = Input.GetAxis ("Horizontal");
        stream.Serialize (horizontalInput);
    } else {
        // Receiving
        stream.Serialize (horizontalInput);
        // ... do something meaningful with the received variable
    }
}

JS script example

OnSerializeNetworkView вызывается в соответствии с sendRate, определённым в настройках проекта менеджера сети. По-умолчанию это происходит 15 раз в секунду.

Если вам нужно использовать в своём скрипте удалённый вызов процедур (RPC), то всё что вам нужно, так это присутствие компонента NetworkView в том же игровом объекте, к которому назначен данный скрипт. Обозреватель сети может использоваться и для чего-нибудь другого, или если он используется только для отправки вызовов RPC, он может быть с отключённой синхронизацией и без слежки за скриптом. Функция, которая должна быть вызвана через сеть, должна иметь атрибут @RPC. Теперь из любого скрипта, назначенного игровому объекту можно вызвать networkView.RPC(), чтобы выполнить удалённую процедуру вызова.

using UnityEngine;
using UnityEngine.Network;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    GameObject playerBullet;
    NetworkView networkView;

    void Start () {
        networkView = new NetworkView ();
    }

    void Update () {
        if (Input.GetButtonDown ("Fire1")) {
            networkView.RPC ("PlayerFire", RPCMode.All);
        }
    }
    
    [RPC]
    void PlayerFire () {
        Instantiate (playerBullet, playerBullet.transform.position, playerBullet.transform.rotation);
    }
}

C# script example

var playerBullet : GameObject;

function Update () {
    if (Input.GetButtonDown ("Fire1")) {
        networkView.RPC ("PlayerFire", RPCMode.All);
    }
}

@RPC
function PlayerFire () {
    Instantiate (playerBullet, playerBullet.transform.position, playerBullet.transform.rotation);
}

JS script example

RPC передаются надёжно и достоверно. Для более подробной информации по RPC посетите страницу подробно об RPC.

Советы

  • Получше ознакомьтесь со справочным руководством по сети, если вы всё ещё не до конца понимаете как использовать обозреватели сети.
  • Для использования удалённых вызовов процедур не нужно отключать синхронизацию состояний.
  • Если у вас имеется более одного обозревателя сети, и вам нужно вызвать удалённую процедуру с одного из них, тогда воспользуйтесь GetComponents(NetworkView)[i].RPC().
Network Views
Сведения о RPC