(Esta clase es parte del sistema antiguo de redes y es obsoleto. Ver NetworkIdentity para el nuevo sistema de redes).
Los Network Views son las puertas de entrada a la creación de juegos multijugador en red en Unity. Ellos son simples de usar, pero son supremamente poderosos. Por esta razón, es recomendado que usted entienda los conceptos fundamentes detrás de las redes antes de comenzar a experimentar con Network Views. Usted puede aprender y descubrir los conceptos fundamentes en el Network Reference Guide.
Para poder usar cualquier capacidad de red, incluyendo State Synchronization o Remote Procedure Calls, su GameObject debe tener un Network View anexado a él.
Propiedad: | Función: |
---|---|
State Synchronization | El tipo de State Synchronization usado por esta Network View |
Off | Ningún State Synchronization será usado. Esta es la mejor opción si usted solo quiere mandar RPCs |
Reliable Delta Compressed | Se enviará la diferencia entre el último estado y el estado actual, si nada ha cambiado, nada será enviado. Este modo es ordenado. En el caso de pérdida de paquetes, el paquete perdido se vuelve a enviar automáticamente |
Unreliable | Se enviará el estado completo. Este utiliza más ancho de banda, pero el impacto de perdida de paquete es minimizado. |
Observed | Los datos del Component que serán enviados a través de la red |
View ID | El identificado único para este Network View. Estos valores son leídos solamente en el Inspector |
Scene ID | El número de id del Network View en esta escena en particular |
Type | Ya sea guardado a la Scene o Asignado en tiempo de ejecución |
Cuando usted agrega un Network View a un GameObject, usted debe decidir dos cosas
La propiedad Observed del Network View puede contener un solo Component. Este puede se un Transform, un Animation, un RigidBody, o un script. Cualquiera que sea el component Observed, información acerca de él será enviada a través de la red. Usted puede seleccionar un Component desde el desplegable, o usted puede arrastrar cualquier encabezado de un Component directamente a una variable. Si usted directamente no está mandando información, sino simplemente usando las llamadas RPC, entonces usted puede apagar la sincronización (ningún dato es directamente enviado) y nada se debe establecer como una propiedad Observed. Las llamadas RPC solamente necesitan una network view presente para que usted no necesite agregar una vista específicamente para un RPC si una vista está ya presente.
Usted tiene 2 opciones para enviar la información del Component Observed : State Synchronization y Remote Procedure Calls.
Para usar State Synchronization, establezca State Synchronization del Network View a Reliable Delta Compressed o Unreliable. La información del Component Observed va a ser enviada ahora a través de la red automáticamente.
Reliable Delta Compressed es ordenado. Los paquetes siempre son recibidos en el orden en el que fueron enviados. Si se deja caer un paquete, ese paquete será re-enviado. Todos los paquetes posteriores se ponen en cola hasta que se reciba el paquete anterior. Solamente la diferencia entre los últimos valores de las transmisiones y los valores actuales son enviados y nada es enviado si no hay una diferencia.
Si se observa una script, debe serializar los datos de forma explícita dentro la script. Usted hace esto dentro de la función 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);
}
}
_Ejemplo de un C# script
function OnSerializeNetworkView (stream : BitStream, info : NetworkMessageInfo) {
var horizontalInput : float = Input.GetAxis ("Horizontal");
stream.Serialize (horizontalInput);
}
Ejemplo de un JS script
La función de encima siempre escribe (una actualización del stream) en horizontalInput, cuando reciba una actualización y lee desde la variable de escritura en el stream de otro modo. Si usted quiere hacer diferentes cosas cuando reciba actualizaciones o enviando, usted puede utilizar el atributo isWriting de la clase 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
}
}
}
_Ejemplo de un C# script
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
}
}
Ejemplo de un JS script
OnSerializeNetworkView es llamado de acuerdo al sendRate especificado en el administrador de redes de los ajustes del proyecto. Por defecto esto es 15 veces por segundo.
Si usted quiere utilizar Remote Procedure Calls en sus scripts todo lo que necesita es un component Network View presente en el mismo GameObject del script que tiene adjunto. El Network View puede ser usado para algo más, o en el caso de que solo sea usado para enviar RPCs puede no tener ningún script observed y el state synchronization apagado. La función que debe ser llamada desde la red debe tener el atributo @RPC. Ahora, desde cualquier script adjuntado al mismo GameObject, usted llama networkView.RPC() para ejecutar el Remote Procedure Call.
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);
}
}
_Ejemplo de un C# script
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);
}
Ejemplo de un JS script
Los RPCs son transmitidos de manera confiable y ordenadamente. Para más información acerca de RPCs, mire la página RPC Details.