Мост Playfab

Это руководство покажет вам, как настроить игру с PlayFab, чтобы автоматически развертывать сервер на Edgegap после того, как игроки будут сопоставлены через матчмейкер PlayFab. Клиенты будут получать информацию для подключения к серверу через PlayFab Player Data, которые сервер обновит, когда будет готов. Перед началом мы предполагаем, что:

Вы можете найти окончательный пример проекта на нашем GitHubarrow-up-right. Этот пример был протестирован с использованием Unity v2021.3.10 и Fishnet v3.11.14 в качестве сетевого кода.

Настройка PlayFab Cloud Script

Создать новую функцию

Войдите в свою учетную запись PlayFab, затем перейдите на страницу обзора вашей игры на панели управления. В Automation вкладке создайте новую функцию Cloud Script, которая будет отправлять запрос к API Edgegap для развертывания нового сервера.

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

Вам также нужно передать некоторые пользовательские переменные окружения в виде пар ключ-значение, а именно:

  • the Match ID сгенерированный матчмейкером PlayFab;

  • a PlayFab Title Secret Key, который можно найти в настройках вашего титула;

  • a list каждого игрока Master Player Account Id.

Эти переменные будут использоваться для обновления PlayFab Player Data игроков информацией, необходимой для подключения к серверу. Запоминайте ключи, которые вы используете для установки этих переменных; в этом примере они: "PLAYFAB_MATCH_ID", "PLAYFAB_TITLE_SECRET", и "PLAYFAB_MATCH_PLAYERS_ID_LIST".

circle-info

Самый простой способ создать эту функцию — развернуть новое ревизию в Revisions (Legacy) вкладке, добавив в неё следующий код. Обязательно обновите Edgegap_AppName, Edgegap_AppVersion, Edgegap_ApiToken и PlayFab_TitleSecret переменные вверху вашими собственными значениями сначала.

Название приложения и версия будут использоваться позже при контейнеризации игрового сервера на Edgegap.

Список ID игроков хранится здесь как одна строка, где каждый ID разделяется запятой.

circle-info

Эта функция Cloud Script создаёт интерфейс между игровым клиентом и API Edgegap, который скрывает ваши Edgegap API token и PlayFab Title Secret от игроков.

Правило автоматизации

Все ещё в Automation, перейдите на вкладку Rules вкладку. Создайте новое правило со следующими настройками:

  • Установите Event Type к playfab.matchmaking.match_found;

  • Добавьте новое Action:

    • Установите Type к Execute Entity Cloud Script;

    • Установите Cloud Script Function к StartEdgegapDeployment.

Очередь матчмейкера и игроки

В Multiplayer вкладке, в разделе Matchmakingубедитесь, что у вас есть доступная очередь, иначе создайте новую. Для быстрой проверки настройте её так, чтобы она просто сопоставляла любые двух игроков вместе.

Вам потребуется достаточное количество игроков, зарегистрированных в вашем титуле PlayFab, чтобы удовлетворить правила матчмейкера, поэтому в данном случае подойдут только двое. При необходимости вы можете создать новых на вкладке Players . Для этого примера проекта обязательно запоминайте Custom ID и Title Player Account ID этих игроков для последующего тестирования.

Редактирование игры

Сервер

После открытия примера игры в редакторе Unity мы добавили новый пустой gameObject в BattleScene найденную в Assets/SpaceEdge/Scenes. Затем мы прикрепили к нему новый скрипт C# под названием PlayerDataUpdateService . Он содержит функцию обратного вызова, которая будет выполнена, как только сервер будет готов.

Мы также создали второй скрипт под названием PlayfabRestApiService, который содержит различные запросы, которые необходимо отправлять к различным API PlayFab.

В PlayerDataUpdateService.csмы получаем несколько переменных окружения, внедрённых в развертывании:

  • Пользовательские переменные:

    • PLAYFAB_MATCH_ID;

    • PLAYFAB_TITLE_SECRET;

    • PLAYFAB_MATCH_PLAYERS_ID_LIST

  • Стандартные переменные Edgegap:

    • ARBITRIUM_PUBLIC_IP;

    • ARBITRIUM_PORTS_MAPPING;

В ARBITRIUM_PORTS_MAPPING, нам нужно получить конкретное внешнее порт значение, которое позволит клиенту подключиться к серверу; в этом примере это значение с именем "Game Port".

Используя PLAYFAB_TITLE_SECRET в качестве аутентификации, мы отправляем запрос к Server API PlayFab, чтобы обновить Player Data для каждого соответствующего ID в PLAYFAB_MATCH_PLAYERS_ID_LIST следующей парой ключ-значение:

  • Ключ: PLAYFAB_MATCH_ID;

  • Значение: "{ARBITRIUM_PUBLIC_IP}:{port}";

PlayerDataUpdateService

PlayfabRestApiService

Клиент

Настройка на стороне клиента будет управляться в MainMenu сцене, найденной в Assets/SpaceEdge/Scenes. Мы создали новый скрипт под названием MainMenuService для управления интерфейсом сцены и отображения различных сообщений игроку, и добавили новые функции в PlayfabRestApiService.cs. Мы также прикрепили этот PlayfabRestApiService скрипт к новому gameObject в этой сцене.

Первое, что должен сделать игрок — войти через PlayFab, что позволит ему отправлять дополнительные запросы к Client и Multiplayer API PlayFab.

circle-info

Мы используем LoginWithCustomID эндпоинт для простоты, однако существуют более подходящие способы реализации входа в зависимости от ситуации (например: для мобильных игр).

После входа игрока и корректной установки заголовков X-Authorization и X-EntityToken для последующих запросов, он может создать новый билет на матчмейкинг, используя кнопку UI Start Game . Это отправит запрос к мультиплеерному API PlayFab и сохранит ticket ID для последующего использования.

После этого игровой клиент периодически будет проверять статус билета каждые несколько секунд, пока матч не будет найден или билет не будет отменён. Как только матч найден, match ID сохраняется как переменная.

Клиент затем периодически будет посылать запросы к Client API PlayFab, чтобы получить Title игрока Player Data, используя match ID в качестве ключа для конкретных данных, которые необходимо получить. Как только данные найдены, он устанавливает адрес сервера порт и внешнее значение в компоненте транспорта сетевого кода, затем подключается к серверу.

Когда клиент подключится и корректно запустится, будет отправлен запрос на удаление информации о подключении из PlayFab этого игрока Player Data благодаря функции обратного вызова.

circle-info

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

PlayfabRestApiService

PlayerDataUpdateService

Сборка игрового сервера и контейнеризация

Перед контейнеризацией сборки сервера убедитесь, что включена опция Start On Headless в NetworkManager gameObject.

Откройте плагин Edgegap через меню панели инструментов Tools/Edgegap Hosting . Проверьте ваш Edgegap API Token и либо создайте, либо загрузите приложение для игры. Убедитесь, что порт значение совпадает со значением компонента Tugboat у NetworkManager gameObject. Выберите UDP protocol, затем введите New Version Tag. Убедитесь, что и название приложения, и версия совпадают со значениями, которые использовались при настройке Cloud Script.

Когда всё будет правильно настроено, нажмите Build and Push, что автоматически контейнеризирует ваш игровой сервер и создаст новую версию приложения на панели Edgegap после короткого ожидания.

circle-info

При создании версии приложения плагин по умолчанию назовёт порт `"Game Port"`.

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

Тестирование

Сначала убедитесь, что отключили Start On Headless в NetworkManager gameObject. Установите PlayfabRestApiService скрипт со значением Custom ID и Title ID вашего первого игрока, а также Title ID и Queue Nameвашей игры. ВBuild Settings

создайте новую клиентскую сборку с этими настройками. Custom ID и Title ID После завершения сборки измените

значения на значения вашего второго игрока. При желании вы можете создать отдельную клиентскую сборку, хотя редактор Unity в режиме Play также должен работать. Start Game Если оба клиента корректно войдут при запуске, нажмите на кнопку

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

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