unityUnity

Учитесь на практике и разверните свой первый выделенный сервер на Edgegap. К концу этого руководства вы бесплатно развернёте выделенный сервер с Edgegap.

✔️ Подготовка

chevron-rightУстановите плагин Edgegap Unity Dedicated Servers Quickstartarrow-up-righthashtag

circle-info

Уверены в своих сборках сервера? Перейдите к Unity или Расширенные возможности для получения дополнительной информации.

⚙️ 1. Подключить аккаунт

☑️ Войдите в систему и убедитесь, что в консоли Unity нет новых ошибок, связанных с плагином Edgegap.

✅ Теперь вы можете перейти к следующему шагу.

chevron-rightУстранение неполадок и FAQhashtag

!Success: 400 BAD REQUEST - POST | https://api.edgegap.com/v1/wizard/init-quick-start - {"message": "Браузер (или прокси) отправил запрос, который этот сервер не смог понять."}

  • Если вы установили, скопировав ZIP-файл, или использовали пример проекта с копией плагина, установленной таким способом, вам нужно будет вручную установить зависимости пакетов, включая библиотеку Newtonsoft JSON, см. официальный репозиторий плагинаarrow-up-right.

  • Пожалуйста, свяжитесь с нами в Discord сообществаarrow-up-right за помощью, если это не так.

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

Независимо от того, используете ли вы Windows, Mac или Linux-машину, вам нужно будет собрать сервер для среды выполнения Linux, поскольку большинство облачных провайдеров сегодня (включая Edgegap) работают на Linux. Не волнуйтесь, для этого с нашим плагином не требуются знания Linux.

☑️ Убедитесь, что вы установили необходимые инструменты сборки Unity для Linux.

☑️ Отредактируйте Build Settings, чтобы убедиться, что все необходимые игровые сцены включены.

circle-info

Продвинутые пользователи Unity — при желании измените Unity Build Settingsarrow-up-right. Внимание! Это может сломать вашу сборку.

☑️ Необязательно: добавьте специфичный для netcode скрипт для проверки порта и начальной настройки окружения в начальную серверную сцену из меню Edgegap Server Hosting (правый клик / в окне Hierarchy).

circle-info

После завершения шага Unity, скрипт проверки порта запишет предупреждение, если адрес или порты netcode не совпадают с вашим Edgegap сопоставлением портов версии приложения .

circle-check

☑️ Когда вы будете довольны своей конфигурацией, нажмите Собрать сервер, дождитесь завершения процесса и убедитесь, что в консоли Unity нет новых ошибок. Выполнение этого шага приведёт к тому, что в корне вашего проекта появится новая папка - Builds/EdgegapServer/ServerBuild .

✅ Теперь вы можете перейти к следующему шагу.

chevron-rightУстранение неполадок и FAQhashtag

Unity: Поддерживаются только автономные цели Windows x64 и OSX с OpenXR.

  • Откройте Packages и отключите OpenXR перед сборкой сервера.

  • Плагин OpenXR требуется только для клиентов и несовместим со сборками серверов Linux. Исключая его из серверных сборок, вы не теряете никакой функциональности.

🐋 3. Контейнеризировать сервер

Работа в команде разработчиков означает совместное использование кода. Когда что-то идёт не так, последнее, что вы хотите услышать, — это «у меня на машине работает». Игровые серверы должны надёжно работать на любой машине, поскольку успешные игровые серверы будут запускаться на тысячах серверных машин по всему миру.

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

☑️ Сейчас начните с нажатия Validate кнопки, чтобы убедиться, что вы завершили Инструменты разработчика.

☑️ Вы можете настроить следующие параметры (или оставить значения по умолчанию):

  • Build path — это относительный путь к артефакту сборки сервера, пока оставим значение по умолчанию.

circle-exclamation
  • Image name — это уникальный идентификатор на ваш выбор, которым помечается сборка сервера перед отправкой.

    • Обычно сюда включают название игры — например, «my-game-server».

  • Image tag — это идентификатор, указывающий на конкретную версию вашего образа.

    • Термин «артефакт сборки» иногда используется для обозначения конкретной версии вашего образа.

    • Отметки времени — отличный вариант для тегов, например 2024.01.30-16.23.00-UTC .

  • Path to Dockerfile можно использовать для настройки рецепта ваших образов.

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

  • Optional docker build parameters можно использовать для более тонкой настройки Docker.

☑️ Когда вы будете довольны своей конфигурацией, нажмите Контейнеризировать с Docker, дождитесь завершения процесса и убедитесь, что в консоли Unity нет новых ошибок. Выполнение этого шага приведёт к тому, что новый образ, появляющийся на вашей локальной машине. Вы можете проверить это либо в Docker Desktop, на вкладке Images под Local (по умолчанию), либо в CLI Docker, выполнив docker images .

✅ Теперь вы можете перейти к следующему шагу.

chevron-rightУстранение неполадок и FAQhashtag

/bin/bash: docker: команда не найдена , или не удалось найти Packages\com.edgegap.unity-servers-plugin\Editor

  • Сначала убедитесь, что вы завершили Инструменты разработчика.

  • Подтвердите, что вы проверили свой аккаунт Edgegap; вы должны были получить ссылку для подтверждения по электронной почте.

  • Некоторые настройки могли сброситься после обновления Docker Desktop. Попробуйте перейти в Docker Desktop Settings / Advanced и в пункте «Choose how to configure the installation of Docker’s CLI tools:» выберите «System (requires password)».


docker build требует ровно 1 аргумент

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


(HTTP code 400) unexpected - invalid tag format


ERROR: failed to solve: ubuntu:22.04: failed to resolve source metadata for http://docker.io/library/ubuntu:22.04: failed to authorize: failed to fetch oauth token

  • Вы находитесь в Китае? Ваше соединение может прерываться Великим файрволом. Попробуйте вручную выполнить docker pull ubuntu:22.04 в командной строке (откройте командную строку, нажав Win+R, затем введите cmd и Enter).


System.IndexOutOfRangeException: Индекс находился за пределами массива.

  • Если вы установили наш плагин Unity quickstart, скачав ZIP, кэш Unity Editor может быть повреждён. Попробуйте удалить копию плагина и установить его с помощью git URL или из Unity Asset Store. Вам больше не нужен пакет Newtonsoft.JSON, так как он автоматически включается вместе с другими исходниками.


Размер моего docker-образа огромный (более 1 ГБ) / крошечный (меньше 100 МБ), это нормально?

  • В некоторых случаях это может быть нормально, если вы можете запускать сервер и успешно подключаться (см. Unity). Если это не так, подумайте о пересмотре параметров сборки, сбросе их к значениям по умолчанию и постепенном добавлении опций, чтобы увидеть, как они влияют на размер сборки. См. также Unity.


Я столкнулся с другой проблемой, не упомянутой нигде в этой документации.

🧪 4. Тестировать сервер локально

☑️ Вы можете настроить следующие параметры (или оставить значения по умолчанию):

  • Тег образа сервера из предыдущего шага.

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

  • Optional docker run parameters можно указать для публикации нескольких портов или запуска вашего образа на машинах macOS.

    • При необходимости вы можете опубликовать несколько портов для своего контейнера, просто добавьте параметр -p {internal port}/{protocol} для каждого, например -p 8080/tcp -p 7770/udp чтобы опубликовать и сопоставить порт вашего сервера 8080 с случайным внешним портом для TCP-подключения и порт сервера 7777 со случайным внешним портом для UDP-подключения одновременно.

    • Настройку порта сервера найдите в своём Transport или специфичных для netcode настройках.

    • Если вы используете машину с архитектурой ARM (macOS M1, M2, M3 и т. д.), вы должны увидеть этот необязательный параметр в Optional docker build parameters: --platform=linux/amd64 .

☑️ Когда вы будете довольны своей конфигурацией, нажмите Развернуть локальный контейнер, дождитесь завершения процесса и убедитесь, что в консоли Unity нет новых ошибок. Выполнение этого шага приведёт к тому, что будет запущен новый контейнер на вашей машине для разработки.

circle-info

Для получения дополнительных сведений см. Docker Desktop / Containers или команду Docker CLI docker ps .

☑️ Теперь пришло время подключить клиент игры Unity Editor к вашему локальному контейнеру Docker чтобы убедиться, что ваш образ сервера работает правильно. Найдите настройки клиента netcode и введите:

  • localhost или 127.0.0.1 (в большинстве случаев эквивалентно) вместо IP сервера,

  • случайное внешнее значение порта, указанное в Docker Desktop / Containers / edgegap-server-test.

✅ Теперь вы можете перейти к следующему шагу.

chevron-rightУстранение неполадок и FAQhashtag

Я не могу подключиться к локальному контейнеру Docker с помощью клиента игры Unity Editor.

  • Сначала убедитесь, что статус контейнера Up и он не находится в состояниях Restarting или Exited, что указывает на исключение во время выполнения. Если контейнер не запущен, просмотрите его журналы через вкладку Docker Desktop Containers (нажмите на контейнер) или используя docker logs {container_id} --timestamps через CLI Docker.

  • Далее проверьте, что настройка порта Network Manager из вашей серверной сборки совпадает с опубликованным портом в Optional docker run parameters. Если нет, попробуйте сбросить или вручную изменить значение этого поля, чтобы оно совпадало с {container} портом в настройках Network Manager. Найдите свой протокол в настройках netcode.

  • Наконец, убедитесь, что настройки netcode вашего клиента игры Unity Editor используют порт, опубликованный в Optional docker run parameters (см. скриншот выше).


(Segmentation fault) - core dumped

  • Если вы используете машину с архитектурой ARM (macOS M1, M2, M3 и т. д.), вы должны увидеть этот необязательный параметр в Optional docker build parameters: --platform=linux/amd64 . Если нет, попробуйте сбросить значение этого поля.


SceneId 9120233082191360994 не найден в SceneObjects.

  • Это может означать, что сцена, которую вы пытаетесь загрузить, не была корректно включена в сборку — известная проблема в более старых версиях плагина. Чтобы исправить это, попробуйте обновить версию интеграции netcode или обновить ваш плагин Edgegaparrow-up-right.


http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed


Curl error 35: Сбой рукопожатия сертификата. Фатальная ошибка. Код ошибки UnityTls: 7

  • Эта ошибка указывает на проблему с проверкой корневого SSL-сертификата — известная проблема в более старых версиях плагина. Чтобы исправить это, попробуйте обновить ваш плагин Edgegaparrow-up-right.

☁️ 5. Загрузить на Edgegap

☑️ Вы можете настроить следующие параметры (или оставить значения по умолчанию):

  • Имя приложения на Edgegap может совпадать с именем вашего образа или быть изменено.

    • Пока мы решили скопировать имя вашего образа.

  • Версия приложения на Edgegap может совпадать с вашим тегом или быть изменена.

    • Отметки времени — отличный вариант для названий версий приложения, например 2024.01.30-16.50.20-UTC .

    • Несколько версий приложения могут ссылаться на один и тот же тег образа, например v1.1.0 и dev .

    • Узнайте больше о Приложения и версии позже.

  • Имя образа сервера из шага Unity.

  • Тег образа сервера из шага Unity.

circle-check

☑️ Когда вы будете довольны своей конфигурацией, нажмите Загрузить образ и создать версию приложения, дождитесь завершения процесса и убедитесь, что в консоли Unity нет новых ошибок.

☑️ Вас перенаправят в наш Dashboardarrow-up-right, где вы сможете настроить дополнительные параметры. Выполнение этого шага приведёт к тому, что будет создана новая версия приложенияarrow-up-right, а ваш артефакт сборки будет помечен тегом и загружен в Container Registry Edgegaparrow-up-right.

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

✅ Теперь вы можете перейти к следующему шагу.

🚀 6. Развернуть в облаке

☑️ Теперь мы выполним финальный тест и подключим клиент игры Unity Editor к вашему облачному развёртыванию. Введите данные подключения клиента игры из Deployment’s:

chevron-rightУстранение неполадок и FAQhashtag

Не удаётся подключить клиентов к серверу - Время ожидания запроса истекло. , 请求超时 , ConnectionFailed , или Проверка порта не удалась

  • Сначала убедитесь, что развёртывание имеет статус Ready, и в его журнале нет исключений во время выполнения или ошибок. Если развёртывание остановилось, просмотрите журналы в нашем Dashboardarrow-up-right.

  • Если вы используете netcode Mirror, вам нужно иметь «Auto Start Server»arrow-up-right выбранным в вашем NetworkManager , пересоберите, отправьте и повторно разверните сервер.

  • Если вы используете netcode FishNet, вам нужно включить «Start on Headless»arrow-up-right в вашем ServerManager, пересоберите, отправьте и повторно разверните сервер.

  • Если вы используете netcode Photon Fusion 2, убедитесь, что ваш сервер передаёт публичный IP развёртывания, внешний порт и roomCode на сервере, а тот же room code — в клиенте в «NeworkRunner.StartGame»arrow-up-right параметре StartGameArgs. Идентификатор Deployment (например, b63e6003b19f) — отличный выбор, поскольку он глобально уникален и легко доступен клиенту через Matchmaker и Подробный обзор.

  • Далее проверьте, что настройка порта в настройках netcode вашей серверной сборки совпадает с внутренним портом в вашем версии приложенияarrow-up-right. Вы можете изменить сопоставление портов, отредактировав версии приложенияarrow-up-right без повторной сборки. Найдите свой протокол в интеграции netcode.

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

  • Если вы используете протокол Secure Websocket (WSS) в вашей интеграции netcode, убедитесь, что для настройки порта WSS включено TLS Upgrade. версии приложенияarrow-up-right портовая конфигурация

  • Вы находитесь в Китае и используете Smart Fleetsarrow-up-right? Ваше соединение может быть заблокировано Великим файрволом. Рассмотрите возможность добавить в свой fleet сервер, расположенный в Китае, или использовать VPN для подключения.


Моё развёртывание остановилось/перезапустилось, и я больше не могу получить доступ к его логам.


Моё развёртывание автоматически остановилось через X минут.

  • Развёртывания Free Tier имеют лимит 60 минут, пожалуйста, рассмотрите возможность обновления аккаунта.

  • Все развёртывания будут завершены по истечении 24 часов работы в соответствии с нашей политикой санитизации серверов, для обслуживания инфраструктуры и чтобы предотвратить неожиданные расходы, если развёртывание не было корректно остановлено. Для долго работающих серверов рассмотрите возможность использования Частные флоты с Сохранение данных.

  • См. Развертывания чтобы узнать все причины остановки вашего развёртывания.


Моё развёртывание готово, но я не могу подключиться ещё несколько минут после этого.

  • Как только развёртывание становится Ready, начинается инициализация игрового движка. Этот процесс может занять от секунд до минут, и в этот период сервер не принимает подключения игроков.

  • Рассмотрите возможность оптимизации инициализации вашего сервера, чтобы сократить это время.

  • Игровые клиенты должны повторять попытку подключения с интервалом в 1 секунду в течение ограниченного времени (в зависимости от длительности инициализации), после чего они должны возвращаться в матчмейкинг.

  • Рассмотрите возможность добавления загрузочной сцены, чтобы сервер мог выполнять инициализацию (и переход, в случае Unreal Engine) одновременно с клиентами, синхронизируя состояние обоих.


Моё устройство Meta Quest выдаёт HTTP 0: Не удаётся разрешить хост назначения .

  • При сборке приложений Unity для Android ваше разрешение Internet Access может автоматически удаляться из выходного артефакта сборки клиента APK.

  • Повторно добавьте разрешения в (требуется последующая пересборка клиента):

    • Project Settings / OpenXR / ⚙️ Meta Quest Support / Force Remove Internet Permissions (снимите галочку).

    • Player Settings / Internet Access (установите require).


Что произойдёт, если игрок покинет моё развёртывание?

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

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

  • Чтобы позволить игрокам присоединяться к уже идущим играм, рассмотрите использование Подробный обзор или Sessionsarrow-up-right.


Мой сервер показывает загрузку CPU 100% после перехода в состояние ready.

  • Это может быть не проблемой, поскольку игровые движки обычно выполняют ресурсоёмкие операции CPU во время инициализации сервера. Если загрузка CPU не снижается через 2–3 минуты после запуска развёртывания, возможно, вам нужно оптимизировать сервер или увеличить ресурсы версии приложения.

  • Снижение tick rate может повлиять на загрузку CPU, так как сервер выполняет меньше операций обмена сообщениями.

  • Если вы используете netcode Mirror, вам нужно иметь «Auto Start Server»arrow-up-right выбранным в вашем NetworkManager , пересоберите, отправьте и повторно разверните сервер.

  • Если вы используете netcode FishNet, вам нужно включить «Start on Headless»arrow-up-right в вашем ServerManager, пересоберите, отправьте и повторно разверните сервер.

  • В Free Tier вам доступно только 1,5 vCPU и 3 ГБ памяти (RAM).

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


Моё развёртывание постоянно перезапускается и показывает ошибку OOM kill

  • Это вызвано превышением выделенного объёма памяти. Рассмотрите возможность оптимизации использования памяти с помощью object pooling, сжатия или удаления ненужных объектов в вашей сцене.

  • Убедитесь, что ваш проект загружает сцену по умолчанию, содержащую ваш NetworkManager и что сцена включена в Build Settings Unity.

  • В Free Tier вам доступно только 1,5 vCPU и 3 ГБ памяти (RAM).

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


Иногда использование памяти (RAM) моего сервера резко возрастает до высокого значения, это проблема?

  • Пока вы не превышаете выделенный объём памяти версии приложения, это не проблема.

  • Превышение выделенного объёма памяти версии приложения приведёт к OOM kill (см. выше).


Будет ли производительность моего сервера ухудшаться из-за других серверов, работающих на той же машине?

  • Нет, наша платформа гарантирует, что выделенные ресурсы не будут использоваться другими студиями или другими серверами на общей инфраструктуре. С Edgegap у вас нет шумных соседей.

👉 Следующие шаги

Остановить развёртывания

Узнайте о различных способах останавливать развёртывания после завершения матча и ухода игроков.

Для корректного завершения мы настоятельно рекомендуем реализовать в вашей игре API self-stop:

chevron-rightПример фрагмента кода Unity C# для self-stop APIhashtag
circle-info

Ваш Unity Server будет автоматически перезапущен в случае сбоя или нехватки памяти.

Внедрённые переменные

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

Проверьте, является ли текущий экземпляр игровым клиентом или сервером проверив, задана ли переменная Edgegap:

Матчмейкинг

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

circle-check

Оптимизация серверных сборок

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

Рассмотрите возможность использования инкрементальных сборок Unityarrow-up-right чтобы ускорить время сборки.

Включайте только то, что действительно необходимо для работы сервера.

Отключите статическую батчинг-обработку мешей, чтобы уменьшить размер образа.

Сжимайте меши, чтобы уменьшить размер образа.

Реализуйте условную ленивую загрузку ресурсов.

Рассмотрите возможность использования многоэтапных сборок Docker (ссылка)arrow-up-right.

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

  • Если вы не уверены, почему одна из ваших команд Dockerfile вызывает ошибку, попробуйте отладить локально. Создайте новый этап прямо перед возникновением проблемы (добавьте вторую FROM команду), используйте --target чтобы указать процессу сборки остановиться на проблемном этапе, а затем docker exec -it {container} /bin/bash чтобы войти в интерактивный терминал внутри контейнера. После этого вы можете использовать команды shell в базовом образе для дальнейшего исследования (например, top в ubuntu).

Настроить образ сервера

Мы также поддерживаем добавление собственного Dockerfile для пользователей, которым нужно больше контроля над своими образами из-за оптимизации размера сборки, лишних зависимостей или более сложного процесса запуска. При желании вы можете указать путь к вашему собственному Dockerfile на шаге Unity. Теперь мы поделимся несколькими советами «сделай сам» и лучшими практиками.

Возникли проблемы при использовании Websockets или HTTPS-запросов?

  • Если вы получаете Curl error 35: Сбой рукопожатия сертификата. Фатальная ошибка. Код ошибки UnityTls: 7 не отчаивайтесь, это известная проблема в старых базовых (FROM) образах, включая просроченный корневой сертификат. Вы можете исправить это, обновившись до более новой версии базового образа (например, ubuntu:22.04), и выполнив update-ca-certificates , добавьте это в ваш Dockerfile:

circle-info

Уперлись в стену? Мы доступны в нашем Discord сообществаarrow-up-right и будем рады помочь.

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

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