Unity Transport Package — это сетевое решение, предоставляемое Unity Technologies для разработчиков игр Unity. Это высокопроизводительное, кроссплатформенное и простое в использовании сетевое решение, которое позволяет разработчикам игр создавать многопользовательские игры и другие приложения, работающие в реальном времени.
Unity Transport Package основан на сетевой системе Unity (UNET), представленной в Unity 5.1. UNET был разработан, чтобы упростить процесс создания многопользовательских игр, предоставляя набор высокоуровневых API-интерфейсов, которые обрабатывали многие низкоуровневые детали сетевого программирования, такие как сериализация, управление пакетами и сетевая синхронизация.
UNET был основан на архитектуре клиент-сервер, где сервер отвечал за управление состоянием игры и связь с клиентами, а клиенты отвечали за рендеринг игры и отправку входных данных на сервер.
В 2018 году Unity отказалась от поддержки UNET и представила Unity Transport Package, представляющий собой низкоуровневое сетевое решение, основанное на библиотеке Enet. Транспортный пакет Unity разработан так, чтобы быть более гибким и производительным, чем UNET, и подходит для широкого спектра вариантов использования, от небольших многопользовательских игр до крупномасштабных приложений реального времени.


Основные функции Unity Transport Package
Транспортный пакет Unity предоставляет ряд функций, в том числе:
- Надежный и ненадежный обмен сообщениями
- Порядок и последовательность сообщений
- Инструменты моделирования и тестирования сети
- Низкоуровневый API для детального управления сетевым стеком
- Интеграция с физическим движком Unity
- Кроссплатформенная поддержка для Windows, macOS, Linux, iOS, Android и WebGL.
Транспортный пакет Unity можно использовать для создания как клиент-серверных, так и одноранговых сетевых архитектур, он предоставляет множество инструментов и API для управления сетевым трафиком, оптимизации производительности и отладки сетевых проблем.


Пример настройки
Вот пример того, как настроить мультиплеер с помощью Unity Transport Package в Unity:
- Создайте новый проект Unity.
- Перейдите в верхнее меню и выберите «Window > Package Manager».
- В окне диспетчера пакетов найдите «Unity Transport» и установите пакет «com.unity.transport».
- Создайте новую сцену и добавьте в нее простой объект, например куб или сферу.
- Добавьте новый скрипт к объекту, выбрав «Component > Scripts > New Script».
- Назовите сценарий «NetworkObject» и откройте его в предпочитаемом вами редакторе кода.
- В сценарии «NetworkObject» добавьте следующий код в начало файла:
using UnityEngine;
using Unity.Networking.Transport;
public class NetworkObject : NetworkBehaviour
{
private UdpNetworkDriver m_Driver;
private NetworkConnection m_Connection;
// ...
}
Этот код устанавливает новый класс с именем «NetworkObject», который расширяет класс «NetworkBehaviour», предоставляемый Unity Transport Package. Переменные «UdpNetworkDriver» и «NetworkConnection» используются для управления сетевым подключением к серверу.
- Добавьте следующий код в метод Start класса NetworkObject:
void Start()
{
m_Driver = new UdpNetworkDriver(new INetworkParameter[0]);
m_Connection = default(NetworkConnection);
var endpoint = NetworkEndPoint.LoopbackIpv4;
endpoint.Port = 9000;
m_Connection = m_Driver.Connect(endpoint);
}
Этот код устанавливает сетевой драйвер и соединение, а также подключается к серверу, работающему на локальном компьютере через порт 9000.
- Добавьте следующий код в метод Update класса NetworkObject:
void Update()
{
m_Driver.ScheduleUpdate().Complete();
if (!m_Connection.IsCreated)
{
return;
}
DataStreamReader reader;
NetworkEvent.Type cmd;
while ((cmd = m_Connection.PopEvent(m_Driver, out reader)) != NetworkEvent.Type.Empty)
{
if (cmd == NetworkEvent.Type.Connect)
{
Debug.Log("Connected to server");
}
else if (cmd == NetworkEvent.Type.Data)
{
// Handle incoming data from the server
}
else if (cmd == NetworkEvent.Type.Disconnect)
{
Debug.Log("Disconnected from server");
m_Connection = default(NetworkConnection);
}
}
}
Этот код обновляет сетевой драйвер, обрабатывает входящие сетевые события и события подключения и отключения.
- Сохраните скрипт и вернитесь в редактор Unity.
- Добавьте скрипт «NetworkObject» к объекту в вашей сцене.
- Нажмите кнопку «Play», чтобы начать игру.
На этом этапе у вас должен быть настроен простой клиент в Unity с использованием Unity Transport Package. Чтобы настроить сервер, вы можете создать новый сценарий, который прослушивает входящие соединения, а также отправляет и получает данные от клиентов. Unity Transport Package предоставляет ряд API для управления сетевыми подключениями и отправки и получения данных, которые можно использовать для создания надежного и масштабируемого сервера для вашей игры.
Вот пример кода для серверного скрипта, который прослушивает входящие соединения, а также отправляет и получает данные от клиентов с помощью Unity Transport Package в Unity:
using UnityEngine;
using Unity.Networking.Transport;
public class NetworkServer : MonoBehaviour
{
private UdpNetworkDriver m_Driver;
private NetworkPipeline m_Pipeline;
private NetworkEndPoint m_Endpoint;
private NativeList<NetworkConnection> m_Connections;
void Start()
{
m_Driver = new UdpNetworkDriver(new INetworkParameter[0]);
m_Pipeline = m_Driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage));
m_Endpoint = NetworkEndPoint.AnyIpv4;
m_Endpoint.Port = 9000;
if (m_Driver.Bind(m_Endpoint) != 0)
{
Debug.Log("Failed to bind to port " + m_Endpoint.Port);
}
else
{
m_Driver.Listen();
m_Connections = new NativeList<NetworkConnection>(16, Allocator.Persistent);
Debug.Log("Server started on port " + m_Endpoint.Port);
}
}
void OnDestroy()
{
m_Driver.Dispose();
m_Connections.Dispose();
}
void Update()
{
m_Driver.ScheduleUpdate().Complete();
// Accept new connections
NetworkConnection c;
while ((c = m_Driver.Accept()) != default(NetworkConnection))
{
m_Connections.Add(c);
Debug.Log("Accepted a connection, id: " + c.InternalId);
}
// Receive data from clients
for (int i = 0; i < m_Connections.Length; i++)
{
if (!m_Connections[i].IsCreated)
{
continue;
}
DataStreamReader stream;
NetworkEvent.Type cmd;
while ((cmd = m_Driver.PopEventForConnection(m_Connections[i], out stream)) != NetworkEvent.Type.Empty)
{
if (cmd == NetworkEvent.Type.Data)
{
// Handle incoming data from clients
// stream.ReadBytes() can be used to read the data
}
else if (cmd == NetworkEvent.Type.Disconnect)
{
Debug.Log("Client disconnected, id: " + m_Connections[i].InternalId);
m_Connections.RemoveAtSwapBack(i);
i--;
}
}
}
// Send data to clients
for (int i = 0; i < m_Connections.Length; i++)
{
if (!m_Connections[i].IsCreated)
{
continue;
}
var writer = m_Driver.BeginSend(m_Pipeline, m_Connections[i]);
writer.WriteBytes(new byte[] { 1, 2, 3 });
m_Driver.EndSend(writer);
}
}
}
Этот код устанавливает новый класс под названием «NetworkServer», который создает сетевой драйвер, прослушивает входящие соединения, а также отправляет и получает данные от клиентов. Сервер прослушивает входящие соединения через порт 9000 и использует «UnreliableSequencedPipelineStage» для управления надежностью и порядком сетевых пакетов. «NativeList» используется для хранения списка подключенных клиентов.
Метод «Update» вызывается каждый кадр и используется для принятия новых подключений, получения данных от клиентов и отправки данных клиентам. Метод «Accept» используется для принятия новых подключений, а метод «PopEventForConnection» — для получения данных от клиентов. Методы «BeginSend» и «EndSend» используются для отправки данных клиентам.
Этот код представляет собой простой пример того, как создать сервер с помощью Unity Transport Package, и его можно расширить для реализации пользовательской логики для обработки входящих данных и отправки данных клиентам. Например, если вы разрабатываете многопользовательскую игру, вы можете использовать этот код для отправки и получения позиций игроков, а также для трансляции обновлений состояния игры всем подключенным клиентам.
Стоит отметить, что Unity Transport Package предназначен для высокопроизводительных сетей и хорошо подходит для многопользовательских игр и других приложений реального времени. Однако он может быть сложным в использовании и требует некоторых знаний сетевых концепций и протоколов.
Если вы новичок в работе с сетями, рекомендуется начать с некоторых базовых руководств по сетям TCP/IP и UDP, а также ознакомиться с различными протоколами, используемыми в сетевом программировании. В Интернете также доступно множество ресурсов, подробно описывающих работу с сетью Unity, включая документацию, учебные пособия и примеры проектов.
В целом Unity Transport Package предоставляет мощную и гибкую основу для создания сетевых приложений в Unity,