unityUnity

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

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

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

circle-info

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

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

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

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

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

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

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

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

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

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

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

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

circle-info

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

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

circle-info

После того как вы выполните шаг Unity, скрипт проверки портов выдаст предупреждение, если адрес или порты вашего сетевого кода не совпадают с настройками Edgegap Отображение портов версии приложения конфигурации.

circle-check

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

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

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

Unity: единственные поддерживаемые отдельные цели — Windows x64 и OSX с OpenXR.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Необязательные параметры сборки docker можно использовать для дальнейшей настройки Docker по более тонким нюансам.

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

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

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

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

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

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

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


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

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


(HTTP код 400) неожиданно — неверный формат тега


ОШИБКА: не удалось решить: ubuntu:22.04: не удалось получить метаданные источника для http://docker.io/library/ubuntu:22.04: не удалось авторизоваться: не удалось получить oauth-токен

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


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

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


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

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


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

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

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

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

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

  • Необязательные параметры docker run могут быть указаны для проброса нескольких портов или запуска образа на macOS.

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

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

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

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

circle-info

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

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

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

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

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

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

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

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

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

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


(Segmentation fault) - core dumped

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


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

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


http2: server: ошибка чтения префейса от клиента //./pipe/docker_engine: файл уже был закрыт


Ошибка Curl 35: Cert handshake failed. Фатальная ошибка. Код ошибки 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 нет новых ошибок.

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

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

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

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

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

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

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

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

  • Если вы используете Mirror netcode, необходимо включить "Auto Start Server”arrow-up-right в ваших компоненте NetworkManager , пересоберите, запушьте и повторно разверните сервер.

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

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

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

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

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

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


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

  • Если процесс сервера аварийно завершается из-за исключения, наша система попытается автоматически перезапустить сервер. Рассмотрите возможность тестирования сервера локально чтобы выявить первопричину.

  • Мы храним логи только в течение времени выполнения развертывания; если вы хотите просмотреть логи после остановки развертывания, пожалуйста, интегрируйте стороннее хранилище логовarrow-up-right.

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


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

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

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

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


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

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

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

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

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


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

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

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

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

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


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

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

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

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


Мой сервер показывает 100% загрузку ЦП после перехода в Ready.

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

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

  • Если вы используете Mirror netcode, необходимо включить "Auto Start Server”arrow-up-right в ваших компоненте NetworkManager , пересоберите, запушьте и повторно разверните сервер.

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

  • В бесплатном тарифе вы ограничены 1.5 vCPU и 3 ГБ памяти (RAM).

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


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

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

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

  • В бесплатном тарифе вы ограничены 1.5 vCPU и 3 ГБ памяти (RAM).

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


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

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

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


Повлияет ли производительность моего сервера наличие других серверов на той же машине?

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

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

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

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

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

chevron-rightПример кода Unity C# для API самозавершенияhashtag
circle-info

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

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

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

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

Матчмейкинг

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

circle-check

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

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

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

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

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

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

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

РассConsider используйте многоступенчатых сборок Docker (ссылка)arrow-up-right.

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

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

Настройка образа сервера

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

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

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

circle-info

Столкнулись с проблемой? Мы доступны в нашем сообществе Discordarrow-up-right и будем рады помочь.

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

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