Unity
Учитесь на практике и разверните свой первый выделенный сервер на Edgegap. К концу этого руководства вы бесплатно развернёте выделенный сервер с Edgegap.
✔️ Подготовка
Уверены в своих сборках сервера? Перейдите к Unity или Расширенные возможности для получения дополнительной информации.
⚙️ 1. Подключить аккаунт
☑️ Войдите в систему и убедитесь, что в консоли Unity нет новых ошибок, связанных с плагином Edgegap.
✅ Теперь вы можете перейти к следующему шагу.
Устранение неполадок и FAQ
!Success: 400 BAD REQUEST - POST | https://api.edgegap.com/v1/wizard/init-quick-start - {"message": "Браузер (или прокси) отправил запрос, который этот сервер не смог понять."}
Если вы установили, скопировав ZIP-файл, или использовали пример проекта с копией плагина, установленной таким способом, вам нужно будет вручную установить зависимости пакетов, включая библиотеку Newtonsoft JSON, см. официальный репозиторий плагина.
Пожалуйста, свяжитесь с нами в Discord сообщества за помощью, если это не так.
🔧 2. Собрать игровой сервер
Независимо от того, используете ли вы Windows, Mac или Linux-машину, вам нужно будет собрать сервер для среды выполнения Linux, поскольку большинство облачных провайдеров сегодня (включая Edgegap) работают на Linux. Не волнуйтесь, для этого с нашим плагином не требуются знания Linux.
☑️ Убедитесь, что вы установили необходимые инструменты сборки Unity для Linux.
☑️ Отредактируйте Build Settings, чтобы убедиться, что все необходимые игровые сцены включены.
Продвинутые пользователи Unity — при желании измените Unity Build Settings. Внимание! Это может сломать вашу сборку.
☑️ Необязательно: добавьте специфичный для netcode скрипт для проверки порта и начальной настройки окружения в начальную серверную сцену из меню Edgegap Server Hosting (правый клик / ➕ в окне Hierarchy).

После завершения шага Unity, скрипт проверки порта запишет предупреждение, если адрес или порты netcode не совпадают с вашим Edgegap сопоставлением портов версии приложения .
Серверные сборки должны использовать адрес 0.0.0.0 и порт 7777 в вашем transport для netcode. Если вы настроили свой порт, укажите то же самое в вашем Приложения и версии после того как вы Unity.
☑️ Когда вы будете довольны своей конфигурацией, нажмите Собрать сервер, дождитесь завершения процесса и убедитесь, что в консоли Unity нет новых ошибок. Выполнение этого шага приведёт к тому, что в корне вашего проекта появится новая папка - Builds/EdgegapServer/ServerBuild .
✅ Теперь вы можете перейти к следующему шагу.
Устранение неполадок и FAQ
Unity: Поддерживаются только автономные цели Windows x64 и OSX с OpenXR.
Откройте Packages и отключите OpenXR перед сборкой сервера.
Плагин OpenXR требуется только для клиентов и несовместим со сборками серверов Linux. Исключая его из серверных сборок, вы не теряете никакой функциональности.
🐋 3. Контейнеризировать сервер
Работа в команде разработчиков означает совместное использование кода. Когда что-то идёт не так, последнее, что вы хотите услышать, — это «у меня на машине работает». Игровые серверы должны надёжно работать на любой машине, поскольку успешные игровые серверы будут запускаться на тысячах серверных машин по всему миру.
Чтобы сделать ваш сервер надёжным, мы используем Docker — программное обеспечение для виртуализации, которое гарантирует, что все зависимости кода вашего сервера, вплоть до уровня операционной системы, всегда будут абсолютно одинаковыми, независимо от того, как и где запускается сервер.
☑️ Сейчас начните с нажатия Validate кнопки, чтобы убедиться, что вы завершили Инструменты разработчика.
☑️ Вы можете настроить следующие параметры (или оставить значения по умолчанию):
Build path — это относительный путь к артефакту сборки сервера, пока оставим значение по умолчанию.
Docker принимает только пути сборки, относительные к корневой папке вашего проекта, держите сборки внутри папки проекта.
Image name — это уникальный идентификатор на ваш выбор, которым помечается сборка сервера перед отправкой.
Обычно сюда включают название игры — например, «my-game-server».
Image tag — это идентификатор, указывающий на конкретную версию вашего образа.
Термин «артефакт сборки» иногда используется для обозначения конкретной версии вашего образа.
Отметки времени — отличный вариант для тегов, например
2024.01.30-16.23.00-UTC.
Path to Dockerfile можно использовать для настройки рецепта ваших образов.
Мы рекомендуем пока оставить значение по умолчанию, позже вы можете узнать больше в разделе Unity.
Optional docker build parameters можно использовать для более тонкой настройки Docker.
Мы рекомендуем пока оставить значение по умолчанию, вы можете прочитать больше позже в документации Docker.
☑️ Когда вы будете довольны своей конфигурацией, нажмите Контейнеризировать с Docker, дождитесь завершения процесса и убедитесь, что в консоли Unity нет новых ошибок. Выполнение этого шага приведёт к тому, что новый образ, появляющийся на вашей локальной машине. Вы можете проверить это либо в Docker Desktop, на вкладке Images под Local (по умолчанию), либо в CLI Docker, выполнив docker images .
✅ Теперь вы можете перейти к следующему шагу.
Устранение неполадок и FAQ
/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
Это известная проблема в macOS Docker версии 4.33, пожалуйста, откатитесь на 4.32 или обновитесь до 4.35.
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.
Я столкнулся с другой проблемой, не упомянутой нигде в этой документации.
Сначала, пожалуйста, попробуйте обновить ваш плагин Edgegap — возможно, мы уже выпустили исправление. Если это не поможет, пожалуйста, свяжитесь с нами в нашем Discord сообщества и мы оперативно разберёмся вместе с вами.
🧪 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 нет новых ошибок. Выполнение этого шага приведёт к тому, что будет запущен новый контейнер на вашей машине для разработки.
Для получения дополнительных сведений см. Docker Desktop / Containers или команду Docker CLI docker ps .
☑️ Теперь пришло время подключить клиент игры Unity Editor к вашему локальному контейнеру Docker чтобы убедиться, что ваш образ сервера работает правильно. Найдите настройки клиента netcode и введите:
localhostили127.0.0.1(в большинстве случаев эквивалентно) вместо IP сервера,случайное внешнее значение порта, указанное в Docker Desktop / Containers / edgegap-server-test.
✅ Теперь вы можете перейти к следующему шагу.
Устранение неполадок и FAQ
Я не могу подключиться к локальному контейнеру 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 или обновить ваш плагин Edgegap.
http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed
Это известная проблема в более старых версиях Docker Desktop для Windows. Пожалуйста, обновите приложение Docker Desktop и попробуйте контейнеризацию снова.
Curl error 35: Сбой рукопожатия сертификата. Фатальная ошибка. Код ошибки UnityTls: 7
Эта ошибка указывает на проблему с проверкой корневого SSL-сертификата — известная проблема в более старых версиях плагина. Чтобы исправить это, попробуйте обновить ваш плагин Edgegap.
☁️ 5. Загрузить на Edgegap
☑️ Вы можете настроить следующие параметры (или оставить значения по умолчанию):
Имя приложения на Edgegap может совпадать с именем вашего образа или быть изменено.
Пока мы решили скопировать имя вашего образа.
Версия приложения на Edgegap может совпадать с вашим тегом или быть изменена.
Отметки времени — отличный вариант для названий версий приложения, например
2024.01.30-16.50.20-UTC.Несколько версий приложения могут ссылаться на один и тот же тег образа, например
v1.1.0иdev.Узнайте больше о Приложения и версии позже.
Имя образа сервера из шага Unity.
Тег образа сервера из шага Unity.
Найдите любое имя образа и тег, сохранённые на вашей машине, в Docker Desktop / Images.
☑️ Когда вы будете довольны своей конфигурацией, нажмите Загрузить образ и создать версию приложения, дождитесь завершения процесса и убедитесь, что в консоли Unity нет новых ошибок.
☑️ Вас перенаправят в наш Dashboard, где вы сможете настроить дополнительные параметры. Выполнение этого шага приведёт к тому, что будет создана новая версия приложения, а ваш артефакт сборки будет помечен тегом и загружен в Container Registry Edgegap.
☑️ Сейчас вам будет предложено указать порт для новой версии приложения. Убедитесь, что вы указали то же значение порта сервера, что и на шаге Unity из настроек Transport или специфичных для netcode.
✅ Теперь вы можете перейти к следующему шагу.
🚀 6. Развернуть в облаке
☑️ Теперь мы выполним финальный тест и подключим клиент игры Unity Editor к вашему облачному развёртыванию. Введите данные подключения клиента игры из Deployment’s:
Хост URL указывающий на IP сервера, обычно в
NetworkManagerкомпоненте.Внешний порт сопоставленный с внутренним портом прослушивания сервера, обычно в компоненте Transport.
Устранение неполадок и FAQ
Не удаётся подключить клиентов к серверу - Время ожидания запроса истекло. , 请求超时 , ConnectionFailed , или Проверка порта не удалась
Сначала убедитесь, что развёртывание имеет статус Ready, и в его журнале нет исключений во время выполнения или ошибок. Если развёртывание остановилось, просмотрите журналы в нашем Dashboard.
Если вы используете netcode Mirror, вам нужно иметь «Auto Start Server» выбранным в вашем
NetworkManager, пересоберите, отправьте и повторно разверните сервер.Если вы используете netcode FishNet, вам нужно включить «Start on Headless» в вашем
ServerManager, пересоберите, отправьте и повторно разверните сервер.Если вы используете netcode Photon Fusion 2, убедитесь, что ваш сервер передаёт публичный IP развёртывания, внешний порт и
roomCodeна сервере, а тот же room code — в клиенте в «NeworkRunner.StartGame» параметреStartGameArgs. Идентификатор Deployment (например,b63e6003b19f) — отличный выбор, поскольку он глобально уникален и легко доступен клиенту через Matchmaker и Подробный обзор.Далее проверьте, что настройка порта в настройках netcode вашей серверной сборки совпадает с внутренним портом в вашем версии приложения. Вы можете изменить сопоставление портов, отредактировав версии приложения без повторной сборки. Найдите свой протокол в интеграции netcode.
Пожалуйста, убедитесь, что ваш игровой клиент подключается к внешнему порту указанному на странице сведений о вашем Deployment; это значение всегда будет случайным по соображениям безопасности.
Если вы используете протокол Secure Websocket (WSS) в вашей интеграции netcode, убедитесь, что для настройки порта WSS включено TLS Upgrade. версии приложения портовая конфигурация
Вы находитесь в Китае и используете Smart Fleets? Ваше соединение может быть заблокировано Великим файрволом. Рассмотрите возможность добавить в свой 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).
Что произойдёт, если игрок покинет моё развёртывание?
По умолчанию серверы не отклоняют подключения игроков. Аутентификация игроков — задача ваших разработчиков, поскольку можно использовать множество разных методов и провайдеров аутентификации.
Игровые клиенты могут хранить информацию о подключении локально, чтобы попытаться переподключиться в случае неожиданных сбоев клиента.
Чтобы позволить игрокам присоединяться к уже идущим играм, рассмотрите использование Подробный обзор или Sessions.
Мой сервер показывает загрузку CPU 100% после перехода в состояние ready.
Это может быть не проблемой, поскольку игровые движки обычно выполняют ресурсоёмкие операции CPU во время инициализации сервера. Если загрузка CPU не снижается через 2–3 минуты после запуска развёртывания, возможно, вам нужно оптимизировать сервер или увеличить ресурсы версии приложения.
Снижение tick rate может повлиять на загрузку CPU, так как сервер выполняет меньше операций обмена сообщениями.
Если вы используете netcode Mirror, вам нужно иметь «Auto Start Server» выбранным в вашем
NetworkManager, пересоберите, отправьте и повторно разверните сервер.Если вы используете netcode FishNet, вам нужно включить «Start on Headless» в вашем
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:
Ваш Unity Server будет автоматически перезапущен в случае сбоя или нехватки памяти.
Внедрённые переменные
Читайте полезную информацию, такую как ID развёртывания, IP-адрес сервера, расположение сервера и многое другое, обращаясь к внедрённым переменным окружения. Каждое развёртывание автоматически включает:
Переменные развёртывания — автоматически предоставляются Edgegap,
Переменные матчмейкинга — автоматически предоставляются Edgegap при использовании Подбор игроков,
Переменные версии приложения — настраиваемые вами пары ключ-значение.
Проверьте, является ли текущий экземпляр игровым клиентом или сервером проверив, задана ли переменная Edgegap:
Матчмейкинг
Если вы вручную запускаете развёртывания, просто вставить URL и порты недостаточно для живой игры.
Узнайте больше о матчмейкинге чтобы развёртывать автоматически, just in time, когда игроки выходят в онлайн.
Оптимизация серверных сборок
Пересобирайте только те ресурсы, которые изменились с прошлого билда.
Рассмотрите возможность использования инкрементальных сборок Unity чтобы ускорить время сборки.
Рассмотрите возможность использования инкрементальных сборок Unity чтобы ускорить время сборки.
Включайте только то, что действительно необходимо для работы сервера.
Копирование неиспользуемых файлов в ваши образы приводит к раздуванию образа, более долгой загрузке, более медленному кэшированию и более медленному общему запуску сервера. Ознакомьтесь с рекомендациями по оптимизации docker-образов.
Отключите статическую батчинг-обработку мешей, чтобы уменьшить размер образа.
Сжимайте меши, чтобы уменьшить размер образа.
Сжатие вершин не влияет на размер образа.
Реализуйте условную ленивую загрузку ресурсов.
Исключайте ресурсы только для клиента, устанавливая для текстур и мешей отключение CPU read/write.
Рассмотрите возможность использования Unity Addressables для ваших клиентских сборок, чтобы ускорить сборки и развёртывания за счёт загрузки ресурсов just in timeили пропуска загрузки некоторых ресурсов в серверных сборках, проверяя наличие Внедряемые переменные.
Рассмотрите возможность использования многоэтапных сборок Docker (ссылка).
Выносите большие серверные зависимости в отдельный образ, чтобы переиспользовать их в многоэтапных сборках. 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:
Уперлись в стену? Мы доступны в нашем Discord сообщества и будем рады помочь.
Последнее обновление
Это было полезно?

