# Unity — начало работы

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

{% embed url="<https://youtu.be/4FR04V4YEUk>" %}

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

<details>

<summary><a href="https://github.com/edgegap/edgegap-unity-plugin">Установите плагин Edgegap's Unity Dedicated Servers Quickstart Plugin</a></summary>

</details>

{% hint style="info" %}
**Уверены в своих сборках сервера?** Перейдите к [#customize-server-image](#customize-server-image "mention") или [Расширенные возможности](/ru/learn/advanced-features.md) для подробностей.
{% endhint %}

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

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

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

<details>

<summary>Я получил ошибку</summary>

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

* Если вы установили, скопировав ZIP-файл, или использовали образец проекта с копией плагина, установленной таким образом, вам потребуется вручную установить зависимости пакетов, включая библиотеку Newtonsoft JSON, см. [официальный репозиторий плагина](https://github.com/edgegap/edgegap-unity-plugin/tree/main?tab=readme-ov-file#instructions-1).
* Пожалуйста, свяжитесь с нами на [Community Discord](https://discord.gg/NgCnkHbsGp) за помощью, если это не так.

</details>

## 🔧 2. Сборка игрового сервера

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

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

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

{% hint style="info" %}
**Опытные пользователи Unity** — при необходимости измените [Unity Build Settings](https://docs.unity3d.com/Manual/BuildSettings.html). Осторожно! Это может сломать вашу сборку.
{% endhint %}

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

<figure><img src="/files/d1e017469bc61e47646a0fb11d800cf488551f97" alt="" width="360"><figcaption></figcaption></figure>

{% hint style="info" %}
Как только вы завершите шаг [#id-6.-deploy-to-cloud](#id-6.-deploy-to-cloud "mention"), скрипт проверки порта выведет предупреждение, если адрес или порты netcode не совпадают с вашим [сопоставлением портов версии приложения](/ru/learn/orkestraciya/application-and-versions.md#other-parameters-optional) .
{% endhint %}

{% hint style="success" %}
Серверные сборки должны использовать адрес `0.0.0.0`  и порт `7777`  в вашем netcode transport. Если вы настраиваете порт, пожалуйста, укажите то же самое в вашем [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md#port-mapping) после того как вы [#id-5.-upload-to-edgegap](#id-5.-upload-to-edgegap "mention").
{% endhint %}

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

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

<details>

<summary>Я получил ошибку</summary>

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

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

</details>

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

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

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

☑️ На данный момент начните с нажатия **Validate** кнопки, чтобы убедиться, что вы завершили [Инструменты разработчика](/ru/unity/developer-tools.md#usage-requirements).

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

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

{% hint style="warning" %}
**Храните сборки внутри папки проекта**, Docker принимает только относительные пути сборки относительно корня проекта.
{% endhint %}

* **Имя образа** — это уникальный идентификатор на ваш выбор, которым помечается сборка сервера перед публикацией.
  * Обычно сюда включают название игры — например, «my-game-server».
* **Тег образа** — это идентификатор, указывающий на конкретную версию вашего образа.
  * Термин «артефакт сборки» иногда используется для обозначения конкретной версии вашего образа.
  * Для тегов отлично подходят временные метки, например `2024.01.30-16.23.00-UTC` .
* **Путь к Dockerfile** может использоваться для настройки рецепта ваших образов.
  * Мы рекомендуем пока оставить значение по умолчанию, позже вы можете прочитать больше в разделе [#customize-server-image](#customize-server-image "mention").
* **Необязательные параметры сборки docker** могут использоваться, чтобы дополнительно указать Docker более тонкие нюансы.
  * Мы рекомендуем пока оставить значение по умолчанию, вы можете [прочитать больше позже в документации Docker](https://docs.docker.com/reference/cli/docker/image/build/#options).

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

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

<details>

<summary>Я получил ошибку</summary>

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

* Сначала убедитесь, что вы завершили [Инструменты разработчика](/ru/unity/developer-tools.md#usage-requirements).
* Подтвердите, что вы проверили свою учётную запись 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](https://github.com/docker/for-win/issues/14258), пожалуйста, рассмотрите откат до 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 МБ), это нормально?

* В некоторых случаях это может быть нормально, если вы можете запустить сервер и успешно подключиться (см. [#id-4.-test-your-server-locally](#id-4.-test-your-server-locally "mention")). Если это не так, рассмотрите возможность пересмотра параметров сборки, сброса их до значений по умолчанию и постепенного добавления опций, чтобы увидеть, как они влияют на размер вашей сборки. Также см. [#optimize-server-build-size](#optimize-server-build-size "mention").

***

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

* Сначала, пожалуйста, попробуйте [обновить ваш плагин Edgegap](https://github.com/edgegap/edgegap-unity-plugin?tab=readme-ov-file#update-the-plugin-in-unity) — возможно, мы уже выпустили исправление. Если это не поможет, пожалуйста, свяжитесь с нами в нашем [Community Discord](https://discord.gg/NgCnkHbsGp) и мы оперативно разберёмся вместе с вами.

</details>

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

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

* **Тег образа сервера** из предыдущего шага.
  * По умолчанию используется последний тег, который вы собрали с помощью плагина.
* **Необязательные параметры docker run** могут быть заданы для открытия нескольких портов или запуска вашего образа на машинах macOS.
  * При необходимости вы можете опубликовать несколько портов для вашего контейнера, просто добавьте параметр `-p {внутренний порт}/{протокол}` для каждого, например `-p 8080/tcp -p 7777/udp` чтобы опубликовать и сопоставить порт вашего сервера `8080` с случайным внешним портом для TCP-подключения и порт сервера `7777` с случайным внешним портом для UDP-подключения одновременно.
  * **Найдите конфигурацию порта сервера в ваших настройках Transport или netcode.**
  * Если вы используете машину с архитектурой ARM (macOS M1, M2, M3 и т. д.), вы должны увидеть этот необязательный параметр, включённый в ваши необязательные параметры сборки Docker: `--platform=linux/amd64` .

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

{% hint style="info" %}
Для более подробной информации см. Docker Desktop / Containers или команду Docker CLI `docker ps` .
{% endhint %}

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

* `localhost` или `0.0.0.0` (в большинстве случаев эквивалентно) вместо IP-адреса сервера,
* случайное значение внешнего порта, найденное в Docker Desktop / Containers / edgegap-server-test.

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

<details>

<summary>Я получил ошибку</summary>

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

* Сначала убедитесь, что статус контейнера Up и он не находится в состоянии Restarting или Exited, что указывало бы на исключение во время выполнения. Если ваш контейнер не запущен, просмотрите его журналы через вкладку Containers в Docker Desktop (нажмите на ваш контейнер) или с помощью `docker logs {container_id} --timestamps` через Docker CLI.
* Далее, пожалуйста, убедитесь, что значение порта Network Manager из вашей серверной сборки совпадает с опубликованным портом в **Необязательные параметры docker run**. Если нет, попробуйте сбросить или вручную изменить значение этого поля, чтобы оно соответствовало `{контейнер}` порту в настройке Network Manager. Найдите ваш протокол в настройках netcode.
* Наконец, убедитесь, что настройки netcode игрового клиента Unity Editor используют порт, опубликованный в **Необязательные параметры docker run** (см. скриншот выше).

***

`(Ошибка сегментации) - core dumped`

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

***

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

* Это может означать, что сцена, которую вы пытаетесь загрузить, не была корректно включена в сборку — известная проблема в старых версиях плагина. Чтобы исправить это, попробуйте обновить версию интеграции netcode или [обновить ваш плагин Edgegap](https://github.com/edgegap/edgegap-unity-plugin?tab=readme-ov-file#update-the-plugin-in-unity).

***

`http2: server: error reading preface from client //./pipe/docker_engine: файл уже был закрыт`

* Это [известная проблема в более старых версиях Docker Desktop для Windows](https://github.com/docker/for-win/issues/13611). Пожалуйста, обновите приложение Docker Desktop и попробуйте контейнеризировать снова.

***

`Curl error 35: Cert handshake failed. Fatal error. UnityTls error code: 7`

* Эта ошибка указывает на проблему проверки корневого SSL-сертификата — известную проблему в старых версиях плагина. Чтобы исправить это, попробуйте [обновить ваш плагин Edgegap](https://github.com/edgegap/edgegap-unity-plugin?tab=readme-ov-file#update-the-plugin-in-unity).

</details>

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

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

* **Имя приложения** в Edgegap может совпадать с именем вашего образа или быть настроено вручную.
  * Мы решили пока скопировать имя вашего образа.
* **Версия приложения** в Edgegap может совпадать с вашим тегом или быть настроена вручную.
  * Отметки времени — отличный вариант для имён версий приложения, например `2024.01.30-16.50.20-UTC` .
  * Несколько версий приложения могут указывать на один и тот же тег образа, например `v1.1.0` и `dev` .
  * Узнайте больше о [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md) позже.
* **Имя образа сервера** из шага [#id-3.-containerize-your-game-server](#id-3.-containerize-your-game-server "mention").
* **Тег образа сервера** из шага [#id-3.-containerize-your-game-server](#id-3.-containerize-your-game-server "mention").

{% hint style="success" %}
Найдите любое имя образа и тег, сохранённые на вашей машине, в **Docker Desktop / Images**.
{% endhint %}

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

☑️ Вас перенаправят в наш [Панели управления](https://app.edgegap.com/), где вы сможете настроить дополнительные параметры. Выполнение этого шага приведёт к тому, что [будет создана новая версия приложения](https://app.edgegap.com/application-management/applications/list), а ваш [артефакт сборки будет помечен тегом и загружен в Container Registry Edgegap](https://app.edgegap.com/registry-management/repositories/list).

☑️ Теперь вам будет предложено определить порт для вашей новой версии приложения. Убедитесь, что установили то же значение порта сервера, что и на шаге [#id-4.-test-your-server-locally](#id-4.-test-your-server-locally "mention") из ваших настроек Transport или netcode.

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

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

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

* **Хост** **URL** указывающий на IP-адрес сервера, обычно в `NetworkManager` компоненте.
* **Внешний порт** сопоставляемый с [внутренним портом прослушивания сервера](/ru/learn/orkestraciya/application-and-versions.md#port-mapping), обычно в компоненте Transport.

<details>

<summary>Я получил ошибку</summary>

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

* Сначала убедитесь, что развёртывание готово, и что в журнале развёртывания нет исключений или ошибок во время выполнения. Если развёртывание остановилось, проверьте журналы в нашей [Панели управления](https://app.edgegap.com/deployment-management/deployments/list).
* Если вы используете netcode Mirror, вам нужно, чтобы ["Auto Start Server”](https://mirror-networking.gitbook.io/docs/hosting/edgegap-hosting-plugin-guide#build-and-push) было выбрано в вашем `NetworkManager` , затем пересоберите, отправьте и повторно разверните сервер.
* Если вы используете netcode FishNet, вам нужно включить [“Start on Headless”](https://fish-networking.gitbook.io/docs/manual/components/managers/server-manager#settings-are-general-settings-related-to-the-servermanager) в вашем `ServerManager`, затем пересоберите, отправьте и повторно разверните сервер.
* Если вы используете netcode Photon Fusion 2, убедитесь, что ваш сервер передаёт публичный IP развертывания, внешний порт и `roomCode` на сервере, а на клиенте — тот же код комнаты в [“NeworkRunner.StartGame”](https://doc.photonengine.com/fusion/current/manual/network-runner#creating-or-joining-a-room) параметре `StartGameArgs`. ID развертывания (например `b63e6003b19f`) — отличный выбор, поскольку он глобально уникален и легко доступен клиенту через [Matchmaker](/ru/learn/matchmeiking/matchmaker-in-depth.md) и [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#injected-environment-variables).
* Далее, пожалуйста, убедитесь, что настройка порта в параметрах netcode вашей сборки сервера совпадает с внутренним портом в вашем [версии приложения](https://app.edgegap.com/application-management/applications/list). Вы можете изменить сопоставление портов, отредактировав [версии приложения](https://app.edgegap.com/application-management/applications/list) без пересборки. Найдите свой протокол в интеграции netcode.
* Пожалуйста, убедитесь, что ваш игровой клиент подключается к **внешнему порту** , указанному на странице сведений о развёртывании; это значение всегда будет случайным по соображениям безопасности.
* Если вы используете протокол Secure Websocket (WSS) в вашей интеграции netcode, убедитесь, что в [версии приложения](https://app.edgegap.com/application-management/applications/list) конфигурации порта для WSS включено TLS Upgrade.
* Вы находитесь в Китае и используете [Smart Fleets](https://docs.edgegap.com/docs/deployment/session/fleet-manager/fleet)? Ваше подключение может быть заблокировано Великим китайским файрволом. Рассмотрите возможность добавить в свой флот сервер, расположенный в Китае, или использовать VPN для подключения.

***

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

* В случае, если процесс сервера аварийно завершится из-за исключения, наша система попытается автоматически перезапустить сервер. Рассмотрите возможность [тестирования вашего сервера локально](#id-4.-test-your-server-locally) чтобы выявить первопричину.
* Мы храним журналы только на время развёртывания; если вы хотите просмотреть журналы после остановки развёртывания, пожалуйста, [интегрируйте стороннее хранилище журналов](https://docs.edgegap.com/docs/deployment/endpoint-storage).
* См. [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped](https://docs.edgegap.com/ru/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped "mention") чтобы узнать все причины остановки вашего развёртывания.

***

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

* Развёртывания на Free Tier имеют лимит 60 минут, пожалуйста, рассмотрите возможность обновления вашей учётной записи.
* Все развёртывания будут завершены через 24 часа работы в соответствии с нашей политикой санитарной очистки серверов, для обслуживания инфраструктуры и чтобы предотвратить неожиданные расходы, если развёртывание не было корректно остановлено. Для долгоживущих серверов рассмотрите использование [Частные пулы](/ru/learn/orkestraciya/chastnye-puly.md) с [Постоянство](/ru/learn/orkestraciya/postoyanstvo.md).
* См. [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped](https://docs.edgegap.com/ru/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped "mention") чтобы узнать все причины остановки вашего развёртывания.

***

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

* После того как развёртывание становится готовым, начинается инициализация игрового движка. Этот процесс может занимать от нескольких секунд до нескольких минут, и в этот период сервер не принимает подключения игроков.
* Рассмотрите возможность оптимизации инициализации сервера, чтобы сократить это время.
* Игровые клиенты должны повторять попытку подключения каждые 1 секунду в течение ограниченного времени (в зависимости от длительности инициализации), после чего они должны возвращаться в матчмейкинг.
* Рассмотрите возможность добавления загрузочного экрана, чтобы сервер мог выполнять инициализацию (и переход в случае Unreal Engine) одновременно с клиентами, синхронизируя при этом состояние обеих сторон.

***

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

* При сборке приложений Unity для Android ваше разрешение на доступ к Интернету может автоматически удаляться из выходного APK-артефакта клиента.
* Снова добавьте разрешения в (после этого потребуется пересобрать клиент):
  * Project Settings / OpenXR / :gear: Meta Quest Support / Force Remove Internet Permissions (снимите галочку).
  * Player Settings / Internet Access (установите require).

***

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

* По умолчанию серверы не отклоняют подключения игроков. Аутентификация игроков — задача ваших разработчиков, поскольку можно использовать множество разных методов и провайдеров аутентификации игроков.
* Игровые клиенты могут сохранять информацию о подключении локально, чтобы попытаться переподключиться в случае неожиданного сбоя клиента.
* Чтобы позволить игрокам присоединяться к уже идущим играм, рассмотрите использование [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#backfill) или [Сеансы](https://docs.edgegap.com/docs/deployment/session).

***

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

* Это может не быть проблемой, поскольку игровые движки обычно выполняют ресурсоёмкие операции CPU во время инициализации сервера. Если загрузка CPU не снижается через 2–3 минуты после запуска развёртывания, возможно, вам нужно оптимизировать сервер или увеличить ресурсы версии приложения.
* Снижение частоты тиков может влиять на использование CPU, поскольку сервер выполняет меньше операций обмена сообщениями.
* Если вы используете netcode Mirror, вам нужно, чтобы ["Auto Start Server”](https://mirror-networking.gitbook.io/docs/hosting/edgegap-hosting-plugin-guide#build-and-push) было выбрано в вашем `NetworkManager` , затем пересоберите, отправьте и повторно разверните сервер.
* Если вы используете netcode FishNet, вам нужно включить [“Start on Headless”](https://fish-networking.gitbook.io/docs/manual/components/managers/server-manager#settings-are-general-settings-related-to-the-servermanager) в вашем `ServerManager`, затем пересоберите, отправьте и повторно разверните сервер.
* В Free Tier вам доступны только 1,5 vCPU и 3 ГБ памяти (RAM).
* Вы можете увеличить выделенные ресурсы при создании новой версии приложения. Вы можете дублировать версию приложения в нашей Панели управления и корректировать эти значения по мере необходимости, без пересборки сервера или образа.

***

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

* Это вызвано превышением выделенного объёма памяти. Рассмотрите возможность оптимизации использования памяти с помощью пулов объектов, сжатия или удаления ненужных объектов из сцены.
* Убедитесь, что ваш проект загружает сцену по умолчанию, содержащую ваш `NetworkManager` и что сцена включена в Build Settings Unity.
* В Free Tier вам доступны только 1,5 vCPU и 3 ГБ памяти (RAM).
* Вы можете увеличить выделенные ресурсы при создании новой версии приложения. Вы можете дублировать версию приложения в нашей Панели управления и корректировать эти значения по мере необходимости, без пересборки сервера или образа.

***

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

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

***

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

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

</details>

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

### Остановка развёртываний

Когда матч заканчивается (или игроки уходят), ваше развёртывание можно остановить, чтобы сэкономить средства. [Запуск пустым или лишь частично заполненным может неоправданно увеличить ваши расходы!](https://edgegap.com/blog/how-session-fill-rate-affects-your-multiplayer-hosting-costs)

{% hint style="success" %}
Импортируйте наш `DeploymentAgent`  пример из Unity SDK, чтобы **легко и надёжно останавливать серверы**.
{% endhint %}

### Внедряемые переменные

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

* [Переменные развёртывания](/ru/learn/orkestraciya/deployments.md#injected-environment-variables) — автоматически предоставляются Edgegap,
* [Переменные матчмейкинга](/ru/learn/matchmeiking/matchmaker-in-depth.md#injected-environment-variables) — автоматически предоставляются Edgegap при использовании [Матчмейкинг](/ru/learn/matchmeiking.md),
* [Переменные версии приложения](/ru/learn/orkestraciya/application-and-versions.md#injected-variables) — настраиваемые парные значения ключ-значение, задаваемые вами.

{% hint style="success" %}
Импортируйте наш `DeploymentAgent`  пример из Unity SDK, чтобы **легко читать строго типизированные переменные**.
{% endhint %}

### Session Automation

### Оптимизируйте сборки

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

Рассмотрите использование [Инкрементальные сборки Unity](https://docs.unity3d.com/Manual/incremental-build-pipeline.html) чтобы ускорить время сборки.

* Рассмотрите использование [Инкрементальные сборки Unity](https://docs.unity3d.com/Manual/incremental-build-pipeline.html) чтобы ускорить время сборки.

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

* Копирование неиспользуемых файлов в образы приводит к их раздуванию, более долгим загрузкам, более медленному кэшированию и более медленному общему запуску сервера. [Изучите рекомендации по оптимизации Docker-образов](https://docs.docker.com/build-cloud/optimization/#dockerignore-files).

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

* [Отключите статическое батчирование для более быстрых сборок, загрузок и развёртываний.](https://docs.unity3d.com/Manual/DrawCallBatching.html)

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

* [Установите сжатие мешей на High для более быстрых сборок, загрузок и развёртываний.](https://docs.unity3d.com/6000.0/Documentation/Manual/compressing-mesh-data-optimization.html)
* Вершинное сжатие не влияет на размер образа.

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

* Исключайте активы, предназначенные только для клиента, [отключая для текстур и мешей чтение/запись CPU](https://docs.unity3d.com/6000.0/Documentation/Manual/dedicated-server-optimizations.html).
* Рассмотрите использование [Unity Addressables](https://docs.unity3d.com/Packages/com.unity.addressables@2.1/manual/index.html) для ваших клиентских сборок, чтобы ускорить сборки и развёртывания за счёт [загрузки ресурсов как раз вовремя](https://docs.unity3d.com/Packages/com.unity.addressables@1.19/manual/LoadingAddressableAssets.html), или пропуская загрузку некоторых ресурсов в серверных сборках, проверяя наличие [Развертывания](/ru/learn/orkestraciya/deployments.md#injected-environment-variables).

**Рассмотрите использование** [**многоэтапных сборок Docker (ссылка)**](https://docs.docker.com/build/building/multi-stage/)**.**

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

### Настроить образ

Мы также поддерживаем добавление собственного Dockerfile для пользователей, которым требуется больший контроль над своими образами из-за оптимизации размера сборки, лишних зависимостей или более сложного процесса запуска. При желании вы можете указать путь к вашему пользовательскому Dockerfile на шаге [#id-3.-containerize-your-game-server](#id-3.-containerize-your-game-server "mention"). Теперь мы поделимся несколькими советами «сделай сам» и лучшими практиками.

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

* Если вы получаете `Curl error 35: Cert handshake failed. Fatal error. UnityTls error code: 7` не отчаивайтесь, это известная проблема со старыми базовыми (`FROM`) образами, включая просроченный сертификат корневого центра сертификации. Исправить это можно, обновившись до более новой версии базового образа (например `ubuntu:22.04`), и выполнив `update-ca-certificates` , добавьте это в ваш Dockerfile:

  ```docker
  FROM ubuntu:22.04

  RUN apt-get install -y ca-certificates && \
      apt-get clean && \
      update-ca-certificates
  ```

{% hint style="info" %}
Уперлись в стену? Мы доступны в нашем [Community Discord](https://discord.gg/MmJf8fWjnt) и будем рады помочь.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.edgegap.com/ru/unity.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
