Callbacks del NetworkBehaviour
Local Discovery

Mensajes en Red

Además de las instalaciones de alto nivel de los comandos y llamadas RPC, también es posible enviar mensajes en red crudos.

Hay una clase llamada MessageBase que puede ser extendida para crear clases de mensajes en red serializables. Esta clase tiene funciones de serialización y des-serialización que toma objetos de escritura (writer) y lectura (reader). Los desarrolladores puede implementar estas funciones ellos mismo, o depender en implementaciones generadas por código que son automáticamente creadas por el sistema en red. La clase base se ve algo así:

public abstract class MessageBase
{
    // De-serialize the contents of the reader into this message
    public virtual void Deserialize(NetworkReader reader) {}

    // Serialize the contents of this message into the writer
    public virtual void Serialize(NetworkWriter writer) {}
}

Las clases de mensaje pueden contener miembros que son tipos básicos, structs, arreglos, y la mayoría de tipos Unity Engine tal como Vector3. Estas no pueden contener miembros que son clases complejas o contenedores genéricos.

Hay clases de mensajes integrados para tipos comunes de mensajes en red:

  • EmptyMessage
  • StringMessage
  • IntegerMessage

Para enviar un mensaje, hay funciones Send() en las clases NetworkClient, NetworkServer y NetworkConnection que funcionan de la misma manera. Estas toman un ID de mensaje, y un objeto mensajes que se deriva de MessageBase. El código de abajo muestra cómo enviar y manejar un mensaje utilizando una de las clases de mensajes integradas:

using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;

public class Begin : NetworkBehaviour
{
    const short MyBeginMsg = 1002;

    NetworkClient m_client;

    public void SendReadyToBeginMessage(int myId)
    {
        var msg = new IntegerMessage(myId);
        m_client.Send(MyBeginMsg, msg);
    }

    public void Init(NetworkClient client)
    {
        m_client = client;
        NetworkServer.RegisterHandler(MyBeginMsg, OnServerReadyToBeginMessage);
    }

    void OnServerReadyToBeginMessage(NetworkMessage netMsg)
    {
        var beginMessage = netMsg.ReadMessage<IntegerMessage>();
        Debug.Log("received OnServerReadyToBeginMessage " + beginMessage.value);
    }
}

Para declarar una clase de un mensaje en red personalizado y utilizarla:

using UnityEngine;
using UnityEngine.Networking;

public class Scores : MonoBehaviour
{
    NetworkClient myClient;

    public class MyMsgType {
        public static short Score = MsgType.Highest + 1;
    };

    public class ScoreMessage : MessageBase
    {
        public int score;
        public Vector3 scorePos;
        public int lives;
    }

    public void SendScore(int score, Vector3 scorePos, int lives)
    {
        ScoreMessage msg = new ScoreMessage();
        msg.score = score;
        msg.scorePos = scorePos;
        msg.lives = lives;

        NetworkServer.SendToAll(MyMsgType.Score, msg);
    }

    // Create a client and connect to the server port
    public void SetupClient()
    {
        myClient = new NetworkClient();
        myClient.RegisterHandler(MsgType.Connect, OnConnected);
        myClient.RegisterHandler(MyMsgType.Score, OnScore);
        myClient.Connect("127.0.0.1", 4444);
    }

    public void OnScore(NetworkMessage netMsg)
    {
        ScoreMessage msg = netMsg.ReadMessage<ScoreMessage>();
        Debug.Log("OnScoreMessage " + msg.score);
    }

    public void OnConnected(NetworkMessage netMsg)
    {
        Debug.Log("Connected to server");
    }
}

Tenga en cuenta que no hay código de serialización para la clase ScoreMessage en este código fuente por ejemplo. El cuerpo de las funciones de serialización son automáticamente generadas para esta clase.

Error Message Class (Clase de un Mensaje Error)

También hay una clase ErrorMessage que deriva de MessageBase. Esta clase se pasa a los callbacks de error en clientes y servidores.

El errorCode en la clase ErrorMessage corresponde a la enumeración Networking.NetworkError.

class MyClient
{
    NetworkClient client;
    
    void Start()
    {
        client = new NetworkClient();
        client.RegisterHandler(MsgType.Error, OnError);
    }
    
    void OnError(NetworkMessage netMsg)
    {
        var errorMsg = netMsg.ReadMessage<ErrorMessage>();
        Debug.Log("Error:" + errorMsg.errorCode);
    }
}
Callbacks del NetworkBehaviour
Local Discovery