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".
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:
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:
| Propiedad | Significa |
|---|---|
IsServer | Este código corre en el servidor |
IsClient | Corre en un cliente |
IsHost | Es servidor y cliente a la vez |
IsOwner | Este cliente es el dueño de este objeto |
IsLocalPlayer | Es el objeto-jugador de este cliente |
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);
}
}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.
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);
}
}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).
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)");
}
}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.
[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":
// En el servidor
GameObject bala = Instantiate(balaPrefab, pos, rot);
bala.GetComponent<NetworkObject>().Spawn(); // ahora existe en todosEl 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
MonoBehaviouren vez deNetworkBehaviouren objetos de red. - Inicializar en
Starten vez deOnNetworkSpawn. - Modificar una
NetworkVariabledesde 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#
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.