Las dos herramientas de sincronización#
En Netcode for GameObjects sincronizas de dos formas, y elegir bien es clave:
- NetworkVariable: para estado continuo que siempre debe estar correcto (vida, munición, posición). Se replica solo a todos.
- RPC: para eventos puntuales que ocurren una vez (disparar, saltar, reproducir un efecto).
¿Es un valor que existe todo el rato y debe estar siempre bien? → NetworkVariable. ¿Es una acción que pasa en un instante? → RPC. Mandar cada acción por variable, o cada estado por RPC, es nadar a contracorriente y llena la red de mensajes.
NetworkVariable: estado replicado#
using Unity.Netcode;
using UnityEngine;
public class Salud : NetworkBehaviour
{
// Por defecto: el servidor escribe, todos leen
public NetworkVariable<int> vida = new NetworkVariable<int>(100);
public override void OnNetworkSpawn()
{
// Reaccionar al cambio (se llama en TODAS las máquinas)
vida.OnValueChanged += (anterior, nuevo) => ActualizarBarra(nuevo);
}
public void RecibirDaño(int cantidad)
{
if (!IsServer) return; // solo el servidor modifica
vida.Value = Mathf.Max(0, vida.Value - cantidad);
}
}Permisos de escritura#
Puedes configurar quién puede leer y escribir una NetworkVariable:
// El dueño (owner) puede escribir; todos leen
NetworkVariable<int> municion = new NetworkVariable<int>(
30,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Owner);Si intentas cambiar una NetworkVariable desde un cliente sin permiso, Netcode lo rechaza. En un modelo servidor-autoritario (lo recomendado contra trampas), el servidor valida y escribe; los clientes solo leen. Da permiso de escritura al owner solo cuando el diseño lo justifique.
RPC: acciones puntuales#
// Cliente -> Servidor
[Rpc(SendTo.Server)]
void DispararRpc()
{
// El servidor valida y reenvía a todos
EfectoDisparoRpc();
}
// Servidor -> todos los clientes
[Rpc(SendTo.ClientsAndHost)]
void EfectoDisparoRpc()
{
// reproducir sonido y partículas en todas las máquinas
}El atributo unificado [Rpc(SendTo.X)] (SendTo.Server, SendTo.ClientsAndHost, SendTo.Owner, SendTo.Everyone...) es la forma moderna en Unity 6. Los clásicos [ServerRpc]/[ClientRpc] siguen funcionando; verás ambos.
Sincronizar el movimiento: NetworkTransform#
No sincronices la posición a mano con una NetworkVariable por frame: usa el componente NetworkTransform, que replica posición, rotación y escala de forma eficiente (con interpolación incluida).
- NetworkTransform (por defecto): autoritario del servidor. El servidor decide la posición; los clientes la ven interpolada. Seguro contra trampas.
- Autoridad del owner (a veces llamado ClientNetworkTransform): cada cliente mueve su propio objeto y lo replica. Más responsivo, menos seguro. Útil para el propio jugador en juegos no competitivos.
| Servidor-autoritario | Owner-autoritario | |
|---|---|---|
| Quién mueve | El servidor | El cliente dueño |
| Anti-trampas | Alto | Bajo |
| Respuesta del propio jugador | Necesita predicción para no notar lag | Inmediata |
| Uso | Competitivo, PvP | Cooperativo, casual |
Interés y ancho de banda#
Cada NetworkVariable y NetworkTransform consume red. En mapas grandes, no tiene sentido enviar a un jugador lo que pasa al otro lado del mundo. Netcode ofrece mecanismos de interest management / visibilidad (NetworkObject.CheckObjectVisibility, spawning con observadores) para mandar a cada cliente solo lo que le concierne. Es clave para escalar.
Errores frecuentes#
- Sincronizar posición con una NetworkVariable manual en vez de NetworkTransform.
- Intentar escribir una NetworkVariable desde un cliente sin permiso (se rechaza).
- Usar RPC para estado continuo (llena la red) o NetworkVariable para eventos de un frame.
- Dar autoridad al cliente en un juego competitivo (puerta a trampas).
- No pensar en la visibilidad y saturar el ancho de banda en mapas grandes.
Ponte a prueba#
Resumen#
Sincroniza estado continuo (vida, munición) con NetworkVariable (por defecto el servidor escribe, todos leen; permisos configurables) y eventos puntuales (disparar) con RPC ([Rpc(SendTo.X)] en Unity 6). Para el movimiento, usa NetworkTransform (servidor-autoritario por defecto; owner-autoritario para más respuesta a cambio de seguridad). Piensa en la visibilidad para no saturar la red. Combínalo con interpolación y predicción.