Note: UNet is deprecated, and will be removed from Unity in the future. A new system is under development. For more information and next steps see this blog post and the FAQ. |
El sistema de network (red) tiene maneras de realizar acciones a través de la red. Este tipo de acciones a veces se llama Remote Procedure Calls. Hay dos tipos de RPCs en el sistema de network, Commands (comandos) - que son llamado del cliente y corren en el servidor; y ClientRpc calls - que son llamadas en el servidor y corren en los clientes.
El diagrama de abajo muestra las direcciones que las acciones remotas toman:
Los comandos son enviados de objetos jugadores en el cliente a objetos jugadores en el servidor. Por seguridad, Commands solamente pueden enviarse desde SU objeto jugador, por lo que usted no puede controlar los objetos de otros jugadores. Para hacer una función un comando, agregue el atributo personalizado [Command] a este, y agregue el prefijo “Cmd”. Esta función ahora va a correr en el servidor cuando sea llamada en el cliente. Cualquier argumento será automáticamente pasado al servidor con el comando.
Las funciones de comandos deben tener prefijos con “Cmd”. Esta es una pista cuando lea código que llame el comando - esta función es especial y no es invocada localmente como una función normal.
class Player : NetworkBehaviour
{
public GameObject bulletPrefab;
[Command]
void CmdDoFire(float lifeTime)
{
GameObject bullet = (GameObject)Instantiate(
bulletPrefab,
transform.position + transform.right,
Quaternion.identity);
var bullet2D = bullet.GetComponent<Rigidbody2D>();
bullet2D.velocity = transform.right * bulletSpeed;
Destroy(bullet, lifeTime);
NetworkServer.Spawn(bullet);
}
void Update()
{
if (!isLocalPlayer)
return;
if (Input.GetKeyDown(KeyCode.Space))
{
CmdDoFire(3.0f);
}
}
}
Tenga cuidado en enviar comandos del cliente cada frame! Esto puede causar mucho trafico en red.
Por defecto, los comandos son enviados en el canal cero - el canal confiable por defecto. Por lo que por defecto, todos los comandos son enviados con confianza al servidor. Esto se puede personalizar con el parámetro “Channel” del atributo personalizado [Command]. Este parámetro debería ser un integer (entero), representando el número del canal.
Channel 1 (Canal 1) también está configurado por defecto en ser un canal no confiable, por lo que para utilizar este, utilice el valor 1 para el parámetro en el atributo Command, así:
[Command(channel=1)]
Comenzando con el lanzamiento de Unity 5.2 es posible enviar comandos de objetos no jugador que tienen una autoridad de cliente. Estos objetos deben haber sido generados con NetworkServer.SpawnWithClientAuthority o tener una autoridad configurada con NetworkIdentity.AssignClientAuthority. Los comandos enviados de estos objetos son ejecutados en la instancia del servidor del objeto, no en el objeto jugador asociado para el cliente.
ClientRpc calls are sent from objects on the server to objects on clients. They can be sent from any server object with a NetworkIdentity that has been spawned. Since the server has authority, then there is no security issues with server objects being able to send these calls. To make a function into a ClientRpc call, add the [ClientRpc] custom attribute to it, and add the “Rpc” prefix. This function will now be run on clients when it is called on the server. Any arguments will automatically be passed to the clients with the ClientRpc call..
Las funciones ClientRpc deben tener un prefijo “Rpc”. Esta es una pista cuando lea código que llame el método - esta función es especial y no es invocada localmente como una función normal.
class Player : NetworkBehaviour
{
[SyncVar]
int health;
[ClientRpc]
void RpcDamage(int amount)
{
Debug.Log("Took damage:" + amount);
}
public void TakeDamage(int amount)
{
if (!isServer)
return;
health -= amount;
RpcDamage(amount);
}
}
Cuando ejecute un juego como un host (anfitrión) con un LocalClient, las llamadas ClientRpc será invocadas en el LocalClient - incluso si está en el mismo proceso que el del servidor. Por lo que el comportamiento de LocalClientes (clientes locales) y RemoteClients (Clientes remotos) es el mismo para llamadas ClientRpc.
Los argumentos pasados a los comandos y llamados ClientRpc son serializados y enviados sobre la red. Estos argumentos pueden ser:
Los argumentos a acciones remotas no pueden ser sub-componentes de GameObjects, tal como instancias de script o Transforms. Estos no pueden ser otros tipos que no pueden ser serializados a través de la red.