Utilice las clases NetworkReader yNetworkWriter para escribir datos en secuencias de bytes.
El API de alto nivel de multijugador se crea utilizando estas clases y las usa de manera exhaustiva. Sin embargo, puede usarlos directamente si desea implementar su propia funcionalidad de transporte personalizado. Tienen funciones de serialización específicas para muchos tipos de Unity (Ver NetworkWriter.Write para obtener la lista completa de tipos).
Para usar las clases, cree una instancia writer y escriba variables individuales en ella. Estas se serializan internamente en un arreglo de bytes, y esto se puede enviar a través de la red. En el lado de recepción, es importante que la instancia del lector para el arreglo de bytes lea las variables exactamente en el mismo orden en que fueron escritas.
Esto se puede usar con la clase MessageBase para crear arreglos de bytes que contienen mensajes de red serializados.
void SendMessage(short msgType, MessageBase msg, int channelId)
{
// write the message to a local buffer
NetworkWriter writer = new NetworkWriter();
writer.StartMessage(msgType);
msg.Serialize(writer);
writer.FinishMessage();
myClient.SendWriter(writer, channelId);
}
Este mensaje está formateado correctamente para que se pueda invocar una función de controlador de mensajes.
El siguiente ejemplo de código es una demostración de nivel bastante bajo, que utiliza las clases de nivel más bajo de la API de alto nivel para configurar la conectividad.
Este es el código para conectar el cliente y el servidor juntos:
using UnityEngine;
using UnityEngine.Networking;
public class Serializer : MonoBehaviour {
NetworkServerSimple m_Server;
NetworkClient m_Client;
const short k_MyMessage = 100;
// When using a server instance like this it must be pumped manually
void Update() {
if (m_Server != null)
m_Server.Update();
}
void StartServer() {
m_Server = new NetworkServerSimple();
m_Server.RegisterHandler(k_MyMessage, OnMyMessage);
if (m_Server.Listen(5555))
Debug.Log("Started listening on 5555");
}
void StartClient() {
m_Client = new NetworkClient();
m_Client.RegisterHandler(MsgType.Connect, OnClientConnected);
m_Client.Connect("127.0.0.1", 5555);
}
void OnClientConnected(NetworkMessage netmsg) {
Debug.Log("Client connected to server");
SendMessage();
}
}
El siguiente fragmento de código envía un mensaje usando el network reader y el network writer, pero usa los manejadores de mensaje integrados en estas clases:
void SendMessage() {
NetworkWriter writer = new NetworkWriter();
writer.StartMessage(k_MyMessage);
writer.Write(42);
writer.Write("What is the answer");
writer.FinishMessage();
m_Client.SendWriter(writer, 0);
}
void OnMyMessage(NetworkMessage netmsg) {
Debug.Log("Got message, size=" + netmsg.reader.Length);
var someValue = netmsg.reader.ReadInt32();
var someString = netmsg.reader.ReadString();
Debug.Log("Message value=" + someValue + " Message string='" + someString + "'");
}
Al configurar los mensajes para los manejadores de mensajes, siempre debe usar NetworkWriter.StartMessage()
(con el tipo de mensaje ID) y las llamadas NetworkWriter.FinishMessage(). Cuando no utiliza los arreglos de bytes, puede omitir ese paso.