Unity Transport Package

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:

  1. Создайте новый проект Unity.
  2. Перейдите в верхнее меню и выберите «Window > Package Manager».
  3. В окне диспетчера пакетов найдите «Unity Transport» и установите пакет «com.unity.transport».
  4. Создайте новую сцену и добавьте в нее простой объект, например куб или сферу.
  5. Добавьте новый скрипт к объекту, выбрав «Component > Scripts > New Script».
  6. Назовите сценарий «NetworkObject» и откройте его в предпочитаемом вами редакторе кода.
  7. В сценарии «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» используются для управления сетевым подключением к серверу.

  1. Добавьте следующий код в метод 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.

  1. Добавьте следующий код в метод 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);
        }
    }
}

Этот код обновляет сетевой драйвер, обрабатывает входящие сетевые события и события подключения и отключения.

  1. Сохраните скрипт и вернитесь в редактор Unity.
  2. Добавьте скрипт «NetworkObject» к объекту в вашей сцене.
  3. Нажмите кнопку «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, и его можно расширить для реализации пользовательской логики для обработки входящих данных и отправки данных клиентам. Например, если вы разрабатываете многопользовательскую игру, вы можете использовать этот код для отправки и получения позиций игроков, а также для трансляции обновлений состояния игры всем подключенным клиентам.

Стоит ли начинать изучать Netcode for GameObjects? Мультиплеер на пальцахСтоит ли начинать изучать Netcode for GameObjects? Мультиплеер на пальцах

Стоит отметить, что Unity Transport Package предназначен для высокопроизводительных сетей и хорошо подходит для многопользовательских игр и других приложений реального времени. Однако он может быть сложным в использовании и требует некоторых знаний сетевых концепций и протоколов.

Если вы новичок в работе с сетями, рекомендуется начать с некоторых базовых руководств по сетям TCP/IP и UDP, а также ознакомиться с различными протоколами, используемыми в сетевом программировании. В Интернете также доступно множество ресурсов, подробно описывающих работу с сетью Unity, включая документацию, учебные пособия и примеры проектов.

В целом Unity Transport Package предоставляет мощную и гибкую основу для создания сетевых приложений в Unity,

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

два × 4 =

Прокрутить вверх