Objetos Jugador
Network Manager callbacks

Visibilidad del objeto

Unity Networking soporta la idea de que no todos los objetos en el servidor deberían estar visibles a todos los jugadores en el juego. Esto a veces se llama “Area of Interest” (área de interés), a medida que a los jugadores solamente se les da visibilidad a objetos que el juego determina que son relevantes o interesantes para ellos. Algunas características de juego que utilizan este concepto son Fog Of War, Stealth y visibilidad basado en proximidad. Esto es especialmente importante cuando el mundo del juego es muy grande en el servidor o contiene muchos objetos en red. Al reducir el conjunto de objetos visibles al jugador se reduce tiempos de login, y ancho de banda de salida - a medida que actualizaciones son enviadas a los jugadores para objetos que son visibles a ellos.

NetworkProximityChecker

La manera más simple de restringir la visibilidad de jugadores es utilizar el componente NetworkProximityChecker. Esto funciona en conjunto con los sistemas de física de Unity 3D o 2D para permitir que solamente los jugadores vean objetos que estén cerca a ellos. Para utilizar este componente, agréguelo al prefab del objeto en red que usted quiere tener la visibilidad restringida. El NetworkProximityChecker tiene algunos parámetros configurables. Los objetos más lejos que “Vis Range” no serán visibles al jugador, y cada conjunto de objetos visibles al jugador serán re-calculados cada “Vis Update Interval” segundos.

El objeto debe tener un physics collider para funcionar con el NetworkProximityChecker.

Visibilidad en Clientes Remotos

Cuando un jugador en un cliente remoto se une a un juego en red, solamente los objetos que están visibles al jugador serán generados en ese cliente. Entonces incluso si el jugador ingresa un mundo grande con muchos objetos en red, el tiempo para la entrada de mundo se puede mantener razonable. Esto aplica a objetos en red en la escena, pero no afectan la carga de assets - los assets para prefabs registrados y objetos de escena todavía están cargados.

A medida que un jugador se mueve dentro del mundo, el conjunto de objetos visibles cambiará. A medida que esto sucede, el cliente se le habla acerca de estos cambios. Hay un mensaje ObjectHide que es enviado a los clientes cuando un objeto ya no está visible. El comportamiento por defecto para manejar este mensaje es destruir el objeto. Cuando un objeto se vuelve visible, el cliente recibe un mensaje ObjectSpawn - tal como si el objeto fuera creado por la primera vez. Por lo que por defecto el objeto es instanciado como cualquier otro objeto generado (spawned).

Visibilidad en el Anfitrión.

A medida que el anfitrión comparte la misma escena que el servidor, este no puede destruir objetos que no están visibles al jugador local. En vez, hay una función virtual en el NetworkBehaviour que es invocada:

public virtual void OnSetLocalVisibility(bool vis)
{
}

Esta función es invocada en todos los scripts en red en objetos que cambian estado de visibilidad. Esto permite que cada script personalice cómo debería responder, tal como desactivar elementos HUD o renderers. La implementación predeterminada en el NetworkProximityChecker desactiva o habilita todos los componentes Renderer en el objeto.

Visibilidad personalizada

El NetworkProximityChecker es implementado utilizando la interfaz publica visibility de Unity Networking. Al utilizar esta interfaz, los desarrolladores deberían ser capaz de implementar cualquier tipo de reglas de visibilidad que deseen. Cada NetworkIdentity le hace seguimiento al conjunto de jugadores al cual es visible. Estos se llaman “observadores” del objeto.

Hay una función en el NetworkIdentity:

// call this to rebuild the set of players observing this object
public void RebuildObservers(bool initialize);

El NetworkProximityChecker llama esta función en un intervalo fijo para que el conjunto de objetos visibles para cada jugado se actualice a medida que se mueva.

En el NetworkBehaviour, hay algunas funciones virtuales para determinar visibilidad:

// called when a new player enters the game
public override bool OnCheckObserver(NetworkConnection newObserver);

// called when RebuildObservers is invoked 
public override bool OnRebuildObservers(HashSet<NetworkConnection> observers, bool initial);

En la función OnCheckObservers es llamada en el servidor en cada objeto en red cuando un nuevo jugador ingrese el juego. Si devuelve true, entonces el jugador es agregado a los observadores del objeto. El NetworkProximityCheck hace una revisión simple en la implementación de esta función.

La función OnRebuildObservers es llamada en el servidor cuando RebuildObservers sea invocado. Esta función espera que un conjunto de observadores sean poblados con los jugadores que puedan ver el objeto. El NetworkServer luego maneja el envío de mensajes ObjectHide y ObjectSpawn basados en la diferentes entre los conjuntos viejos y nuevos de visibilidad. El NetworkProximityChecker utiliza Physics.OverlapSphere() para encontrar los jugadores que están dentro de la distancia de visibilidad para este objeto.

Tenga en cuenta que para decir si un objeto es un jugador, revise si tiene una “connectionToClient” válida en su NetworkIdentity. Por ejemplo:

    var hits = Physics.OverlapSphere(transform.position, visRange);
    foreach (var hit in hits)
    {
        // (if an object has a connectionToClient, it is a player)
        var uv = hit.GetComponent<NetworkIdentity>();
        if (uv != null && uv.connectionToClient != null)
        {
            observers.Add(uv.connectionToClient);
        }
    }
Objetos Jugador
Network Manager callbacks