Version: 2017.4
Network View
State Synchronization Details (Legacy)

Detalles RPC (Legacy)

(Para nuevos proyectos puedes usar el Nuevo Networking System introducido en 5.1. Esta información es para antiguos proyectos usando el sistema antiguo de networking.)

Remote Procedure Calls (RPCs) le permite a usted llamar funciones en una maquina remota. Invocar un RPC es similar a llamar una función normal y es tan fácil pero tiene algunas diferencias importantes que hay que entender.

  1. Una llamada RPC puede tener tantos parámetros como desee pero el ancho de banda de red implicado aumentará con el número y tamaño de parámetros. Debe mantener los parámetros al mínimo para obtener el mejor rendimiento.

  2. A diferencia de una llamada de función normal, un RPC necesita un parámetro adicional para indicar los destinatarios de la solicitud RPC. Existen varios modos de llamada RPC posibles para cubrir todos los casos de uso comunes. Por ejemplo, puede invocar fácilmente la función RPC en todas las máquinas conectadas, en el servidor solo, en todos los clientes, excepto en el que envía la llamada RPC o en un cliente específico.

Las llamadas RPC suelen usarse para ejecutar algún evento en todos los clientes en el juego o pasar información de eventos específicamente entre dos partes, pero puede ser creativo y utilizarlos como desee. Por ejemplo, un servidor para un juego que sólo se inicia después de que cuatro clientes se hayan conectado podría enviar una llamada RPC a todos los clientes tan pronto como se conecte el cuarto, iniciando así el juego. Un cliente de un jugador en particular podría enviar llamadas RPC a todo el mundo para indicar que recogieron un elemento. Un servidor puede enviar un RPC a un cliente en particular para inicializar el reproductor justo después de conectarse, por ejemplo, para asignarles su número de jugador, ubicación del spawn, color del equipo, etc. Un cliente podría enviar un RPC solo al servidor para Especificar las opciones de inicio, como el color que prefieren o los artículos que han comprado.

Usando RPCés

Una función debe estar marcada como un RPC antes de que se pueda invocar remotamente. Esto se hace prefijando la función en el script con un atributo RPC:

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    [RPC]
    void PrintText (string text)
    {
        Debug.Log(text);
    }
}

_Ejemplo de un C# script

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

Ejemplo de un JS script

Toda la comunicación de red es manejada por los componentes de NetworkView, por lo que debe adjuntar uno al objeto cuyo script declara las funciones RPC antes de que se puedan llamar.

Parámetros

Usted puede utilizar los siguientes tipos de variable como parámetros a RPCs:-

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

Por ejemplo, el siguiente código invoca una función RPC con un solo parámetro 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");
    }
}

_Ejemplo de un C# script

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

Ejemplo de un JS script

El primer parámetro de un RPC() es el nombre de la función en ser invocada mientras que el segundo determina los objetivos en los que será invocado. En este caso, nosotros invocamos la llamada RPC en todos los que estén conectados al servidor (pero la llamada no será buffered para esperar por clientes que se conectan después - mire abajo para unos detalles adicionales acerca de buffering).

Todos los parámetros después de los dos primeros son los que se pasarán a la función RPC y se enviarán a través de la red. En este caso, “Hello World” se enviará como parámetro y se pasará como parámetro de texto en la función PrintText.

También puede acceder a un parámetro interno adicional, una estructura NetworkMessageInfo que contiene información adicional, como por ejemplo, de dónde procede la llamada RPC. Esta información se pasará automáticamente, por lo que la función PrintText mostrada anteriormente se puede declarar como:

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    [RPC]
    void PrintText (string text, NetworkMessageInfo info)
    {
        Debug.Log(text + " from " + info.sender);
    }
}

_Ejemplo de un C# script

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

Ejemplo de un JS script

… mientras se invoca de la misma manera que antes.

Como se menciono arriba, un Network View debe estar anexado a cualquier GameObject que tiene un script que contiene funciones RPC. Si usted está utilizando RPCs exclusivamente (ie, sin una state Synchronization) entonces los Network Views State Synchronization__ se puede Apgar.

RPC Buffer

Las llamadas RPC también se pueden almacenar en búfer. Las llamadas RPC almacenadas en memoria intermedia se almacenan y se ejecutan en el orden en que se emitieron para cada nuevo cliente que se conecta. Esto puede ser una manera útil de asegurarse de que un jugador de improvisación reciba toda la información necesaria para comenzar. Un escenario común es que cada jugador que se une a un juego primero debe cargar un nivel específico. Usted podría enviar los detalles de este nivel a todos los jugadores conectados, pero también amortiguarlo para todos los que se unen en el futuro. Al hacerlo, asegúrese de que el nuevo jugador reciba la información de nivel como si estuviera presente desde el principio.

También puede quitar llamadas del búfer RPC cuando sea necesario. Siguiendo el ejemplo anterior, el juego puede haberse movido desde el nivel de inicio por el momento en que un nuevo jugador se une, por lo que podría quitar el original RPC almacenado en búfer y enviar uno nuevo para solicitar el nuevo nivel.

Network View
State Synchronization Details (Legacy)