🎮 UnityDocs

Sincronizar estado: NetworkVariable, RPC y NetworkTransform

El corazón del multiplayer con Netcode: cuándo usar NetworkVariable (estado continuo) frente a RPC (eventos puntuales), cómo sincronizar el movimiento con NetworkTransform y quién tiene la autoridad.

📄 ArtículoAvanzado✅ RevisadoUnity 6.0 LTSActualizado 2026-07-15
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 9 min · ⌨️ Práctica 30 min

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).
La regla mental

¿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#

C#
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:

C#
// El dueño (owner) puede escribir; todos leen
NetworkVariable<int> municion = new NetworkVariable<int>(
    30,
    NetworkVariableReadPermission.Everyone,
    NetworkVariableWritePermission.Owner);
Por defecto solo el servidor escribe

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#

C#
// 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
}
RPC universales en NGO 2.x (Unity 6)

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.
⚖️ Comparativa · Autoridad del NetworkTransform
Servidor-autoritarioOwner-autoritario
Quién mueveEl servidorEl cliente dueño
Anti-trampasAltoBajo
Respuesta del propio jugadorNecesita predicción para no notar lagInmediata
UsoCompetitivo, PvPCooperativo, casual

Interés y ancho de banda#

No mandes todo a todos

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#

📝 Pon a prueba lo aprendido

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.

Fuentes y para profundizar