Mirror

Mirror на Edgegap

Этот гид поможет вам создать безголовый сервер на Edgegap для проекта Unity, использующего Mirrorarrow-up-right в качестве решения для сетевого взаимодействия.

В этом руководстве будет использоваться открытый пример проекта Tanks, который уже доступен в вашем примере Mirror по пути Assets/Mirror/Examples/Tanks.

Окончательный пример можно найти на нашем GitHubarrow-up-right.

Сборка игрового сервера

Когда игра будет готова, перейдите на экран Build в Unity Editor, в разделе File -> Build Settings в верхнем меню. Убедитесь, что выбраны правильные пресеты в зависимости от вашей версии Unity.

  • До версии 2021.2:

    • Установите Целевую платформу в Linux;

    • Установите Архитектуру в x86_64;

    • Поставьте галочку на Server Build опции.

  • Иначе:

    • Установите Платформа в Dedicated Server;

    • Установите Целевую платформу в Linux.

Затем нажмите Build и выберите новую пустую папку с именем linux_server в качестве места назначения файлов. Перенесите linux_server папку во вторую пустую папку, которая в этом документе будет называться [SERVER BUILD] папкой.

Контейнеризация выделенного игрового сервера

В этой части мы создадим docker-образ, содержащий выделенный игровой сервер. Вам также может быть интересно прочитать Unity Server in Docker.

Если вам нужна дополнительная информация о Docker с Edgegap, пожалуйста, обратитесь к этой документации.

Dockerfile

Обратите внимание на порт, который вы используете для сетевых коммуникаций, именуемый [GAME PORT]. По умолчанию используется порт 7777. Эту информацию можно найти в Unity Editor, на объекте NetworkManager в компоненте Transport .

  • Скопируйте приведённые выше строки и вставьте их в ваш Dockerfile, расположенный внутри [SERVER BUILD]. Измените [GAME PORT] заполнители на ваш игровой порт.

Наличие [GAME PORT] открытого на TCP и UDP позволяет вам использовать любой транспорт по вашему выбору в NetworkManager компоненте Mirror. Наконец, создайте файл с именем boot.sh в корне [SERVER BUILD] папки. Он будет выполняться при запуске образа в контейнере.

  • Скопируйте следующие две строки, убедитесь, что заменили [YOUR GAME] заполнители на имя сгенерированного файла.

На данном этапе у вас должна быть следующая иерархия:

  • папка [SERVER BUILD] > > - Dockerfile > > - boot.sh > > - linux_server папка > > > - файлы, сгенерированные Unity

  • Откройте командную строку в папке [SERVER BUILD] и выполните следующие команды Docker:

circle-exclamation

Использование Linux

Используя cmd

Используя Powershell

После этих команд вы должны увидеть загруженный образ на сайте Edgegap, если вы используете Edgegap Container Registry. Смотрите этот документ если хотите использовать реестр Edgegap. Вы также можете использовать другой приватный реестр.

Развёртывание на Edgegap

Перейдите на страницу Applications & Games веб-сайта. Нажмите на кнопку Create New в правом верхнем углу, чтобы открыть форму создания приложения. Ниже перечислены поля и как их правильно заполнить:

  • Application name : Может быть любым заметным именем, которое вы хотите использовать, чтобы легко распознавать ваше приложение среди других.

  • Image : Может быть любой конкретный образ, который вы хотите использовать, чтобы легко распознавать ваше приложение среди других.

  • Version name : Вы можете использовать имя версии, чтобы описать назначение версии, которую вы разворачиваете. Примеры: “demo”, “production”, “v1”, “v2”

  • Container :

    • Registry : “ [URL] ”, где [URL] — значение из учетных данных, которые вы можете показать на странице Container Repository.

    • Image repository : “ [PROJECT]/[YOUR GAME] ”, где [PROJECT] и [YOUR GAME] — значения, которые вы использовали ранее при отправке docker-образа.

    • Tag : “ [TAG] ”, где [TAG] — значение, которое вы использовали ранее при отправке docker-образа.

    • Отметьте «Using a private repository»

    • Private registry username : “ [USERNAME] ”, где [USERNAME] — значение из ваших учетных данных.

    • Private registry token : “ [TOKEN] ”, где [TOKEN] — значение из ваших учетных данных.

    • Requirements : Оставьте как есть.

    • Ports :

      • Нажмите на + Add port ссылку, чтобы добавить новый порт, и добавьте следующие записи:

        • [GAME PORT] - TCP/UDP - отключить проверки

        • 3389 - TCP - отключить проверки

После создания приложения вы можете нажать кнопку Deploy чтобы продолжить развёртывание вашего игрового сервера. Выберите регион для развёртывания и введите количество случайных игроков, которые вы хотите сгенерировать в зависимости от вашей игры. Проверьте, что всё работает корректно, проверив следующее:

  • Latest Status должен быть установлен на Ready.

  • Во вкладке Port Mapping вы должны видеть порт, который вы указали в форме создания приложения:

Добавление примерного HUD в ваше клиентское приложение

  • Установите значение Port компонента Transport в NetworkManager на внешний порт, определённый во вкладке Port Mapping вашего развёртывания.

В этом примере порт был установлен в 31887. Это в основном зависит от разрабатываемой игры и, скорее всего, будет устанавливаться программно в кодовой базе игры.

  • Установите значение Network Address для Network Manager на Hostвашего развёртывания. Этот URL можно найти в Deployment Summary на панели управления или через API.

В этом примере адрес был установлен как 0ace560706a5.pr.edgegap.net. Опять же, это значение, скорее всего, будет устанавливаться программно во время взаимодействия клиента с мастером/API, отвечающим за процесс матчмейкинга.

При правильных данных вы сможете нормально подключиться к игровому серверу и начать играть сразу.

Теперь у вас есть проект на Mirror, готовый для развёртывания по требованию!

С развёртываниями на основе мест (seat-based deployments) можно использовать Mirror для создания системы, которая автоматически удаляет зависшие сессии Edgegap после того, как игрок отключается от сервера, с использованием NetworkManager функций обратного вызова, и NetworkBehaviour скрипта, прикреплённого к префабу игрока, который использует Remote Procedure Call (RPC) функцию и Command функцию.

Когда сервер запускается, NetworkManager получает список ID сессий связанных с его развёртыванием через API Edgegap и сохраняет их. После этого, когда новый игрок подключается к серверу, инициируется клиентская функция через RPC , которая отправит IP-адрес игрока обратно на сервер с помощью команды. Имея IP игрока, сервер проверяет наличие совпадающего IP в данных каждой сессии; сервер получает данные сессии, используя её кэшированный ID через API Edgegap. Если совпадение найдено, ID сессии соотносится с NetworkConnectionToClient.

этого игрока.

Поскольку новые сессии могут добавляться после запуска сервера, список ID сессий обновляется, и новые сессии проверяются, если совпадение не было найдено с первого раза. NetworkConnectionToClient Наконец, когда игрок отключается от сервера, сервер использует ID сессииэтого игрока для получения связанной с ним

информации о сессии, затем использует API Edgegap для удаления этой сессии. Это освобождает сокет в развёртывании для подключения нового игрока.

Debug.LogError("Соединение не найдено.");

Debug.LogError($"Ошибка при удалении сессии: {request.error}");

Дополнительные возможности

Этот скрипт можно расширять дополнительными, независимыми функциями, которые помогают управлять сессиями в отдельных случаях. Например, таймаут можно установить для удаления пустых сессий мест после настраиваемого промежутка временипосле полной инициализации сервера

. Это полезная функция в случае, если игрок покидает игру до того, как его билет матчмейкера будет обработан, что привело бы к созданию пустой сессии после нахождения матча. Если игрок не отправит свой IP для сопоставления с ID сессии до истечения таймаута, то эта сессия будет удалена для освобождения сокета. Другой функцией может быть отключение неактивных игроков после длительного периода времени, чтобы освободить сокеты. После подключения к серверу клиент должен отправлять минимальное heartbeat-сообщение на серверкаждые несколько секунд , иначе он отключается, если пропущено слишком многоheartbeat'ов подряд

. Как интервал между heartbeat'ами, так и максимальное число подряд пропущенных сообщений можно настроить в зависимости от потребностей игры. В этом примере heartbeat отправляется каждые несколько секунд, если танк двигается по карте или стреляет.

CustomNetworkManager.Instance.StoreClientHeartbeatTime(conn, time);

Последнее обновление

Это было полезно?