Mirror

Mirror на Edgegap

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

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

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

Собрать игровой сервер

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

  • До версии 2021.2:

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

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

    • Отметьте Серверная сборка опции.

  • В противном случае:

    • Установите Платформа к Выделенный сервер;

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

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

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

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

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

Dockerfile

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

  • Скопируйте приведённые выше строки и вставьте их в ваш 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

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

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

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

  • Имя версии: Вы можете указать имя версии, чтобы описать назначение версии, которую вы разворачиваете. Примеры: «demo», «production», «v1», «v2»

  • Контейнер:

    • Реестр: «[URL]», где [URL] — значение из учётных данных, которые можно отобразить на странице репозитория контейнеров.

    • Репозиторий образа: «[PROJECT]/[YOUR GAME]», где [PROJECT] и [YOUR GAME] — значения, которые вы использовали ранее при отправке образа Docker.

    • Тег: «[TAG]», где [TAG] — значение, которое вы использовали ранее при отправке образа Docker.

    • Отметьте «Используется приватный репозиторий»

    • Имя пользователя приватного реестра: «[USERNAME]», где [USERNAME] — значение из ваших учётных данных.

    • Токен приватного реестра: «[TOKEN]», где [TOKEN] — значение из ваших учётных данных.

    • Требования: Оставьте как есть.

    • Порты:

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

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

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

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

  • Последний статус должен быть установлен в Готов.

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

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

  • Установите Порт значение свойство Relay GUI NetworkManager к внешнему порту, определённому в Сопоставление портов вкладке вашего развёртывания.

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

  • Установите значение Сетевой адрес в Сетевом менеджере на адрес Хост. Этот URL можно найти в Сводке развёртывания на панели управления или через API.

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

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

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

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

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

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

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

PlayerNetworkBehaviour

CustomNetworkManager

Дополнительные функции

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

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

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

PlayerNetworkBehaviour - управление сессиями мест

CustomNetworkManager - управление сессиями мест

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

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