🎮 UnityDocs

Netcode for GameObjects: la base oficial

La solución de red oficial de Unity. Cómo se monta (NetworkManager, NetworkObject), cómo sincronizar estado con NetworkVariable y acciones con RPC, y las novedades de NGO 2.x en Unity 6.

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

Qué es#

Netcode for GameObjects (NGO) es la solución de red oficial de Unity: la mejor integrada con el motor y con soporte a futuro. Sigue el modelo servidor-autoritario y admite modo host (un jugador hace de servidor y cliente). Se instala desde el Package Manager buscando "Netcode for GameObjects".

Requisitos

Necesitas el paquete NGO y un transporte (viene el Unity Transport). En la escena, un objeto con el componente NetworkManager configurado con ese transporte. Los objetos en red llevan un componente NetworkObject, y tus scripts heredan de NetworkBehaviour (no de MonoBehaviour).

Arrancar la conexión#

El NetworkManager ofrece tres formas de arrancar:

C#
using Unity.Netcode;
using UnityEngine;

public class MenuRed : MonoBehaviour
{
    public void Host()    => NetworkManager.Singleton.StartHost();   // servidor + cliente
    public void Cliente() => NetworkManager.Singleton.StartClient(); // solo cliente
    public void Servidor()=> NetworkManager.Singleton.StartServer(); // solo servidor (dedicado)
}

NetworkBehaviour y propiedad (ownership)#

Tus scripts de red heredan de NetworkBehaviour, que añade propiedades clave:

PropiedadSignifica
IsServerEste código corre en el servidor
IsClientCorre en un cliente
IsHostEs servidor y cliente a la vez
IsOwnerEste cliente es el dueño de este objeto
IsLocalPlayerEs el objeto-jugador de este cliente
C#
using Unity.Netcode;
using UnityEngine;

public class JugadorRed : NetworkBehaviour
{
    [SerializeField] private float velocidad = 5f;

    void Update()
    {
        // Solo el DUEÑO controla el movimiento de su jugador
        if (!IsOwner) return;

        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");
        transform.Translate(new Vector3(x, 0, z) * velocidad * Time.deltaTime);
    }
}
Sincroniza la posición sin código: NetworkTransform

Para que el movimiento del jugador se replique a los demás, añade el componente NetworkTransform al objeto. Sincroniza posición/rotación/escala automáticamente. Configúralo en modo owner authoritative si quieres que cada cliente mueva su propio jugador.

Sincronizar estado: NetworkVariable#

Una NetworkVariable replica un valor a todos los clientes automáticamente. Por defecto, el servidor escribe y todos leen.

C#
using Unity.Netcode;
using UnityEngine;

public class Salud : NetworkBehaviour
{
    // Valor inicial 100; el servidor lo modifica, todos lo leen
    public NetworkVariable<int> vida = new NetworkVariable<int>(100);

    public override void OnNetworkSpawn()
    {
        // Reaccionar a los cambios (se llama en todas las máquinas)
        vida.OnValueChanged += (viejo, nuevo) => Debug.Log($"Vida: {nuevo}");
    }

    // Solo llamar en el servidor
    public void RecibirDaño(int cantidad)
    {
        if (!IsServer) return;
        vida.Value = Mathf.Max(0, vida.Value - cantidad);
    }
}
OnNetworkSpawn, no Start

En NGO, la inicialización de red va en OnNetworkSpawn() (cuando el objeto ya existe en la red), no en Start. Ahí ya puedes leer IsOwner, suscribirte a NetworkVariable, etc.

Acciones puntuales: RPC#

Un RPC ejecuta un método en otra máquina. El patrón clásico: el cliente pide algo al servidor (ServerRpc), el servidor lo valida y avisa a todos (ClientRpc).

C#
using Unity.Netcode;
using UnityEngine;

public class Arma : NetworkBehaviour
{
    void Update()
    {
        if (IsOwner && Input.GetKeyDown(KeyCode.Space))
            DispararServerRpc();
    }

    // Lo llama el cliente, se EJECUTA en el servidor
    [ServerRpc]
    void DispararServerRpc()
    {
        // El servidor valida y avisa a todos los clientes
        EfectoDisparoClientRpc();
    }

    // Lo llama el servidor, se EJECUTA en todos los clientes
    [ClientRpc]
    void EfectoDisparoClientRpc()
    {
        Debug.Log("¡Bang! (visible en todas las máquinas)");
    }
}
Novedad de NGO 2.x (Unity 6): RPC universales

Además de [ServerRpc] y [ClientRpc] (que siguen funcionando), NGO 2 introdujo un atributo unificado con destino explícito: [Rpc(SendTo.Server)], [Rpc(SendTo.ClientsAndHost)], [Rpc(SendTo.Owner)], etc. Es la forma nueva recomendada; en tutoriales verás las dos.

C#
[Rpc(SendTo.Server)]
void DispararRpc() { /* corre en el servidor */ }

Spawnear objetos en red#

Instanciar en un cliente no lo replica. Los objetos en red se crean en el servidor y se "spawnean":

C#
// En el servidor
GameObject bala = Instantiate(balaPrefab, pos, rot);
bala.GetComponent<NetworkObject>().Spawn();   // ahora existe en todos

El prefab debe tener NetworkObject y estar registrado en la lista de prefabs de red del NetworkManager.

Servicios de Unity (para publicar sin montar servidores)#

NGO encaja con Unity Gaming Services: Relay (conecta jugadores sin abrir puertos ni compartir IP), Lobby (salas y emparejamiento) y modelos de autoridad distribuida. Tienen capa gratuita y son la vía moderna para lanzar online sin infraestructura propia. También puedes usar la red de Steam como transporte.

Errores frecuentes#

  • Heredar de MonoBehaviour en vez de NetworkBehaviour en objetos de red.
  • Inicializar en Start en vez de OnNetworkSpawn.
  • Modificar una NetworkVariable desde un cliente (por defecto solo el servidor escribe).
  • Instanciar objetos de red sin llamar a .Spawn() (solo aparecen en una máquina).
  • Mover el jugador sin comprobar IsOwner (mueves el de todos).

Ponte a prueba#

📝 Pon a prueba lo aprendido

Resumen#

NGO es la red oficial de Unity: NetworkManager para arrancar (host/cliente/servidor), scripts que heredan de NetworkBehaviour, NetworkVariable para estado sincronizado, RPCs para acciones (con los nuevos [Rpc(SendTo.X)] en NGO 2.x), NetworkTransform para posición y .Spawn() para crear objetos en red. Comprueba IsOwner, inicializa en OnNetworkSpawn y deja la autoridad en el servidor. Compáralo con las alternativas en la comparativa.

Fuentes y para profundizar