Важно: UNet — это устаревшее решение, а также новая многопользовательская и сетьсистема Unity, которая обеспечивает многопользовательскую игру. игры через компьютерную сеть. Подробнее См. в Словарь Решение (Netcode для GameObjects) находится в разработке. Дополнительную информацию и дальнейшие действия см. на веб-сайте Unity Netcode for GameObjects. |
Используйте классы NetworkReader и NetworkWriter для записи данных к байтовым потокам.
Многопользовательская API высокого уровняСистема создания многопользовательских возможностей для игр Unity . Он построен поверх нижнего уровня транспортного уровня связи в реальном времени и выполняет многие общие задачи, необходимые для многопользовательских игр. Подробнее
См. в Словарь построен с использованием этих классов и широко их использует. Однако вы можете использовать их напрямую, если хотите реализовать свои собственные функциональные возможности транспорта. У них есть специальные функции сериализации для многих типов Unity (полный список типов см. в NetworkWriter.Write).
Чтобы использовать классы, создайте экземпляр модуля записи и запишите в него отдельные переменные. Они сериализуются внутри в массив байтов, и это может быть отправлено по сети. На принимающей стороне важно, чтобы экземпляр считывателя массива байтов считывал переменные точно в том же порядке, в котором они были записаны.
Это можно использовать с классом MessageBase для создания массивов байтов, содержащих сериализованные сетевые сообщения.
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);
}
Это сообщение имеет правильный формат, поэтому для него можно вызвать функцию обработчика сообщений.
Использование классов NetworkReader и NetworkWriter с классами NetworkServerSimple и NetworkClient
Следующий пример кода представляет собой довольно низкоуровневую демонстрацию, в которой используются классы самого низкого уровня из высокоуровневого API для настройки подключения.
Это код для соединения клиента и сервера вместе:
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();
}
}
Следующий фрагмент кода отправляет сообщение, используя средства сетевого чтения и записи, но использует обработчики сообщений, встроенные в эти классы:
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 + "'");
}
При настройке сообщений для обработчиков сообщений всегда следует использовать вызовы NetworkWriter.StartMessage()
(с идентификатором типа сообщения) и вызовы NetworkWriter.FinishMessage(). Если вы не используете байтовые массивы, вы можете пропустить этот шаг.