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.
Las llamados del ClientRpc son enviadas de objetos en el servidor a objetos en clientes. Estos pueden ser enviados de cualquier objeto servidor con un NetworkIdentity que fue generado. Ya que el servidor tiene autoridad, entonces no hay problemas de seguridad con los objetos del servidor siendo capaces de enviar estas llamadas. Para hacer una función a una llamada ClientRpc, agregue el atributo personalizado [ClientRpc] a este, y agregue el prefijo “Rpc”. Esta función ahora va a ejecutarse en clientes cuando sea llamado en el servidor. Cualquier argumento va a automáticamente ser pasado a los clientes con un llamado ClientRpc…
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.