> For the complete documentation index, see [llms.txt](https://docs.edgegap.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.edgegap.com/ru/learn/matchmeiking.md).

# Матчмейкинг

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

Матчмейкинг в играх, основанных на матчах, как правило, стремится к следующему:

* **найти других игроков** на основе таких критериев, как регион, задержка, навыки или параметры игры;
* **найти серверы** чтобы подключиться к ним в зависимости от доступной вместимости \[или пинга, региона, навыков, карты, режима];
* **запустить новый сервер** если существующие серверы заполнены или не соответствуют критериям игрока.

Опыт игрока стоит на первом месте, определяя наши основные цели:

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

{% hint style="success" %}
В качестве альтернативы, позвольте игрокам **выбрать постоянный (всегда онлайн) сервер** из списка с [Браузер серверов](/ru/learn/brauzer-serverov.md).
{% endhint %}

Следуйте этому видео, чтобы начать работу с нашим сервисом Matchmaker:

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

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

**Тестирование этого сервиса полностью бесплатно, кредитная карта не требуется.**

Бесплатный тариф предоставляет до 3 часов работы на нашем общем тестовом кластере после каждой перезагрузки.

В этом руководстве предполагается, что вы уже:

* [поняли модель развёртывания Edgegap](https://docs.edgegap.com/ru/learn/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-1.-just-in-time-deployment-dedicated-servers),
* опубликовали ваше серверное приложение на Edgegap ([Unreal Engine](/ru/unreal-engine.md), [Unity](/ru/unity.md)),
* успешно подключились с игрового клиента к вашему серверу на Edgegap.

### Архитектура матчмейкинга

Это руководство будет посвящено **API матчмейкинга и API backfill**.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fp2QpL1MXYtwSWB2VJN2A%2Fimage.png?alt=media&amp;token=ecc73799-c2e6-4884-965f-48e4c125659c" alt=""><figcaption></figcaption></figure>

Существует четыре (4) важных потока данных, когда используется матчмейкинг:

1. [API матчмейкинга](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-api) **используется игровыми клиентами для связи с Matchmaker:**
   1. для управления группами, назначения серверов и мониторинга,
   2. для измерения пинга с помощью [Пинг-маяки](/ru/learn/orkestraciya/ping-beacons.md).
2. [Развертывания](/ru/learn/orkestraciya/deployments.md) API используется Matchmaker для развертывания, масштабирования и управления вашими выделенными серверами.
3. [Транспорты Netcode](/ru/docs/sample-projects.md) используются для связи между игровыми клиентами и выделенными серверами.
4. [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#backfill-match) **для замены или добавления игроков на работающий сервер.**

{% hint style="info" %}
После релиза, **ваш матчмейкер должен будет работать 24/7** чтобы игроки по всему миру могли подключаться к серверам.
{% endhint %}

## 🍀 Простой пример

Начните с простого примера и протестируйте базовый поток игроков в матчмейкинге:

* создание экземпляра матчмейкера на общем [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#hosting-cluster),
* определение правил и настроек в вашем матчмейкере [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#configuration),
* тестирование потока игроков и управление билетами с помощью [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-api).

### 1. Настройка на бесплатном тарифе

☑️ [Зарегистрируйте бесплатную учетную запись Edgegap](https://app.edgegap.com/auth/register) и откройте [страницу панели Matchmaker](https://app.edgegap.com/matchmaker-management-v2/matchmakers/list).

☑️ Нажмите **Создать матчмейкер** сначала, затем введите:

* имя матчмейкера — для вашего удобства, например `quickstart-dev` ,
* загрузите нашу JSON-конфигурацию Simple Example.

🍀 **Simple Example (минимальная рекомендуемая конфигурация):**

{% hint style="danger" %}
**Обязательно измените** **`имя`**  **и** **`версию`**  **в соответствии с** [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md).
{% endhint %}

<pre class="language-json"><code class="lang-json">{
  "version": "3.3.3",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "simple-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "<a data-footnote-ref href="#user-content-fn-1">my-game-server</a>",
        "version": "<a data-footnote-ref href="#user-content-fn-2">2024.01.30-16.23.00-UTC</a>"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 2,
              "max_team_size": 2
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 100,
              "max_latency": 200
            }
          }
        },
        "expansions": {}
      }
    }
  }
}
</code></pre>

**Устранение неполадок и FAQ:**

<details>

<summary><code>Конфигурация приложения недействительна для профиля XYZ.</code></summary>

* Мы не смогли найти ваш [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md), пожалуйста, проверьте `приложение`  значения.

</details>

<details>

<summary><code>Docker-образ для '2024.01.30-16.23.00-UTC' не кэширован.</code></summary>

[**🌟 Обновитесь до тарифа Pay as You Go**](https://app.edgegap.com/user-settings?tab=memberships) **чтобы разблокировать** [**мгновенные развёртывания с кэшированием**](https://docs.edgegap.com/ru/learn/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-1.-start-a-deployment)**.**

* Некэшированные образы размером 4 ГБ и более могут дольше развёртываться, что приведёт к [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-4.-deployment-error](https://docs.edgegap.com/ru/learn/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-4.-deployment-error "mention"). Рассмотрите возможность оптимизации размера образа сервера ([Unreal Engine](/ru/unreal-engine.md#optimize-server-build-size) / [Unity](/ru/unity.md#optimize-server-build-size)).
* Вы всё равно можете продолжить, хотя мы рекомендуем протестировать время развёртывания.

</details>

☑️ Если ошибок проверки не появилось, нажмите **Создать и запустить** и дождитесь завершения процесса. В результате будет запущен новый бесплатный кластер с вашим матчмейкером Simple Example.

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

### 2. Изучите конфигурацию

По мере выпуска обновлений Matchmaker каждая новая версия использует [семантическое версионирование](/ru/learn/matchmeiking/matchmaker-in-depth.md#changelog) чтобы ясно передавать влияние изменений, используя формат `major.minor.patch`:

* 🔥 `major` версии включают несовместимые изменения и требуют проверки интеграции,
* 🌟 `minor` версии включают значительные обратно совместимые улучшения,
* 🩹 `patch` версии включают исправления ошибок и незначительные улучшения.

[Проверяйте билеты](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-api) чтобы лучше понимать и отлаживать возможные потоки матчмейкинга в процессе разработки. Мы рекомендуем отключить API инспекции для вашего боевого матчмейкера.

**Некоторые** [**развертывания могут завершаться ошибками**](https://docs.edgegap.com/ru/learn/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-4.-deployment-error)**.** Мы пытаемся решить это, повторяя развертывание до `max_deployment_retry_count` раз автоматически (без подтверждения клиента).

Чтобы неожиданные сбои клиента или заброшенные билеты не зависали и не занимали ресурсы вашего матчмейкера, неподобранные билеты будут отменены через `ticket_expiration_period` в результате чего их статус изменится на `CANCELLED` а затем окончательно удалены через `ticket_removal_period` .

{% hint style="info" %}
[Узнайте, как матчмейкер максимизирует заполнение матчей и сокращает время ожидания в очереди менее чем до 10 секунд.](/ru/learn/matchmeiking/matchmaker-in-depth.md#find-match)
{% endhint %}

Ядро нашей логики матчмейкинга настраивается в [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-profiles). Каждый профиль — это полностью изолированная очередь матчмейкинга, указывающая на [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md#app-versions) с заранее заданным количеством необходимых ресурсов CPU и памяти (RAM).

[Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-rules) в начальном наборе правил должны выполняться, чтобы игроки были сгруппированы вместе; каждое правило определяется тремя свойствами:

* имя по вашему выбору, напр. - `размер матча`,
* тип правила, также известный как оператор, напр. - `player_count`,
* и, наконец, атрибуты оператора, напр. `team_count` или `max_team_size`.

**Правило количества игроков**

Это специальное правило, определяющее, сколько игроков должно совпасть, чтобы инициировать назначение:

* `team_count` относится к количеству команд; 1 команда может использоваться для кооперативных режимов или режимов каждый сам за себя,
* `min_team_size` относится к минимальному числу игроков в команде.
* `max_team_size` относится к максимальному числу игроков в команде.

Наш простой пример демонстрирует кооперативную игру для 2 игроков.

{% hint style="warning" %}
Правило количества игроков **обязательно и может быть определено только один раз** в правилах начальной конфигурации.
{% endhint %}

**Правило задержек**

**`задержки`** — это специальное правило, оптимизирующее пинг матчей игроков:

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

<details>

<summary>Пример правила: <code>маяки</code></summary>

`маяки` правило, настроенное с `"difference": 100, "max_latency": 200`  будет сопоставлять:

:white\_check\_mark: Алиса и Боб могут быть сопоставлены:

* Токио отбрасывается (>200 мс),
* задержка для Чикаго в пределах абсолютной разницы 100 мс.

<table><thead><tr><th width="180">Город маяка</th><th width="80">Матч</th><th width="132">abs(A - B) [мс]</th><th width="164">Алиса [мс]</th><th width="164">Боб [мс]</th></tr></thead><tbody><tr><td>Чикаго</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>75.0</td><td>12.3</td><td>87.3</td></tr><tr><td>Лос-Анджелес</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><a data-footnote-ref href="#user-content-fn-3">113.2</a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td>145.6</td><td>32.4</td></tr><tr><td><del>Токио</del></td><td>н/д</td><td>н/д</td><td><a data-footnote-ref href="#user-content-fn-4"><del>233.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><a data-footnote-ref href="#user-content-fn-4"><del>253.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr></tbody></table>

:x: Алиса и Чарли никогда не будут сопоставлены:

* нет маяков с задержкой < 200 мс для обоих игроков,
* Алиса живет в Северной Америке — Иллинойс,
* Чарли живет в Азии — Япония.

<table><thead><tr><th width="180">Город маяка</th><th width="80">Матч</th><th width="132">abs(A - B) [мс]</th><th width="164">Алиса [мс]</th><th width="164">Чарли [мс]</th></tr></thead><tbody><tr><td><del>Чикаго</del></td><td>н/д</td><td>н/д</td><td>12.3</td><td><a data-footnote-ref href="#user-content-fn-4"><del>215.6</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr><tr><td><del>Лос-Анджелес</del></td><td>н/д</td><td>н/д</td><td>145.6</td><td><a data-footnote-ref href="#user-content-fn-4"><del>238.3</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr><tr><td><del>Токио</del></td><td>н/д</td><td>н/д</td><td><a data-footnote-ref href="#user-content-fn-4"><del>233.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td>24.2</td></tr></tbody></table>

</details>

{% hint style="warning" %}
Правило `задержки`  — это **является необязательным и может быть определено только один раз в вашей начальной конфигурации** правила.
{% endhint %}

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

### 3. Просмотрите сведения об экземпляре

☑️ Просмотрите сведения о вашем новом матчмейкере на панели управления после его инициализации:

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FY4Byy46pgEoXXmrtH92n%2Fimage.png?alt=media&amp;token=3fb5fd0e-526e-4f89-ac9a-9ee6809aeaf1" alt=""><figcaption></figcaption></figure>

* **Статус** указывает на состояние сервиса; может быть ONLINE, OFFLINE или ERROR.
* **Идентификатор** помогает сотрудникам Edgegap быстро найти ваш матчмейкер, если вам понадобится помощь в устранении неполадок.
* **Запущен в** может быть полезно для отслеживания времени последнего обновления.
* **Размер** соответствует одному из наших [тарифных планов](https://edgegap.com/resources/pricing#matchmaker).
* **URL API** будет использоваться игровыми клиентами и игровыми серверами для связи с вашим матчмейкером.
* **URL Swagger** — это удобный GUI спецификации OpenAPI, который мы предоставляем для изучения схемы API.
* **Токен аутентификации** — это уникальный секретный токен, используемый игровыми клиентами и игровым сервером для аутентификации.

{% hint style="danger" %}
**Сотрудники Edgegap никогда не будут запрашивать ваши токены. Сгенерируйте токен заново, если подозреваете нарушение безопасности.**
{% endhint %}

Чтобы протестировать ваш новый матчмейкер, **вам понадобятся URL Swagger, URL API и токен аутентификации**.

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

{% hint style="info" %}
Чтобы обновить правила матчмейкера в процессе разработки, измените конфигурацию и перезапустите его.
{% endhint %}

{% hint style="success" %}
См. [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#rolling-updates-and-ab-tests) для боевых игр и обновлений без простоя.
{% endhint %}

### 4. Протестируйте API билетов

{% hint style="info" %}
**Пожалуйста, подождите до 5 минут** после запуска вашего матчмейкера, чтобы завершилось распространение DNS.
{% endhint %}

☑️ Сначала, **откройте ваш URL Swagger** чтобы просмотреть схему OpenAPI в GUI Swagger:

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FyFErlc8rw9KHMOqloIUF%2Fimage.png?alt=media&amp;token=5a806adf-d644-4af6-b65e-9af82232bfcd" alt=""><figcaption></figcaption></figure>

☑️ Нажмите **Авторизовать** 🔒, вставьте ваш **Токен аутентификации**и подтвердите, нажав **Авторизовать**.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FWnFM0p4UwDuo6Z5IOiUf%2Fimage.png?alt=media&amp;token=7cbdff75-7f6b-467c-8df3-fa568b846dac" alt=""><figcaption></figcaption></figure>

☑️ Прокрутите вниз до **API билетов** **- POST /tickets**, разверните и нажмите **Попробовать**.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FpxA3FxrxhlelzSWvb5CO%2Fimage.png?alt=media&amp;token=8fc4fa97-44d5-48e3-8c02-c2dd49c6cd74" alt=""><figcaption></figcaption></figure>

☑️ Предварительный просмотр вашего запроса:

* обратите внимание `player_ip` установлено в `null` - это заставит Matchmaker использовать IP-адрес, автоматически добавленный к вашему запросу (см. [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#server-to-server-api) для альтернатив),
* `profile` относится к вашему [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-profiles),
* `attributes` содержит значения для ваших правил матчмейкера, в данном случае для `задержек` правила,
  * правило `player_count` — это единственное правило, которое не требует никаких атрибутов в билетах игроков.

☑️ Нажмите **Выполнить** и просмотрите ответ на ваш запрос билета игрока:

* `id` — это ваш уникальный ID билета матчмейкинга; сохраните его, чтобы позже проверить свой билет,
* `profile` подтверждая выбор [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-profiles),
* `group_id` — это уникальный [ID группы, присваиваемый каждому билету; одиночный игрок представлен как группа из 1](/ru/learn/matchmeiking/matchmaker-in-depth.md#group-up),
* `team_id` — это уникальный ID команды, присваиваемый каждому игроку один раз, `TEAM_FOUND` когда достигается статус,
  * [каждая команда может содержать несколько групп, не превышая заданный размер команды](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-rules),
* `player_ip` — это определенный публичный IP-адрес игрока, независимо от метода идентификации,
* `назначение` установлено в `null` чтобы указать, что билет не был сопоставлен или назначен серверу,
* `created_at` предоставляет информацию о том, когда билет игрока был создан, для использования в игровом интерфейсе,
* `статус` указывает текущий статус билета; все билеты начинаются в `SEARCHING` .

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FZauPhgT9t1roetX4yc7g%2Fimage.png?alt=media&amp;token=7834faf8-ce73-42dc-bae0-0293f05f1ea1" alt=""><figcaption></figcaption></figure>

☑️ Создайте второй билет, нажав **Выполнить** снова, чтобы наши два игрока сопоставились и сервер был запущен.

☑️ Сверните POST /tickets и откройте **GET /tickets/{ticketId}**, затем нажмите **Попробовать**.

☑️ Введите ID билета из ответа на предыдущем шаге и нажмите **Выполнить**.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FNznf5aHqhWefs77SFbzJ%2Fimage.png?alt=media&amp;token=1d04803c-fbe6-4a19-9ef7-f814ea87affe" alt=""><figcaption></figcaption></figure>

☑️ Просмотрите обновленное назначение для вашего билета игрока:

* статус изменился на `MATCH_FOUND` сначала, при этом сохраняя `назначение` установлено в `null` чтобы указать, что игроки сопоставлены и сервер назначается,

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FGzBkyUepbqP71lFWG052%2Fimage.png?alt=media&amp;token=a0412446-cc4f-4070-a14c-fef79046f3f7" alt=""><figcaption></figcaption></figure>

☑️ Нажмите **Выполнить** снова, чтобы проверить свой билет и просмотреть обновленное назначение для него:

* статус изменился на `HOST_ASSIGNED` с `назначение` содержащее сведения о назначенном сервере.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FWnbG4B1KFoxttkz5bALl%2Fimage.png?alt=media&amp;token=12a10044-2117-4a6d-845a-76c243231552" alt=""><figcaption></figcaption></figure>

<details>

<summary>Устранение неполадок и FAQ</summary>

Мой билет застрял в `SEARCHING` .

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

***

Мой билет застрял, переключаясь между `MATCH_FOUND` и `TEAM_FOUND` многократно.

* Учетные записи Free Tier ограничены 1 развертыванием одновременно. Пожалуйста, рассмотрите возможность обновления тарифа или остановите текущее развертывание, чтобы запустить новое.

***

Мой билет сразу переходит в `CANCELLED`.

* Срок действия вашего билета истек. Создайте новый билет или увеличьте период истечения в вашей конфигурации для целей тестирования.

***

Я получаю HTTP 404 Not Found при проверке моего билета.

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

</details>

☑️ [Проверьте ваше новое развертывание на нашей панели управления](https://app.edgegap.com/deployment-management/deployments/list):

* обратите внимание, что каждое развертывание помечается всеми ID билетов и профилем для дополнительной трассируемости.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FG4Ear9NrMHhgFH6T4ODB%2Fimage.png?alt=media&amp;token=acc9831c-a9d2-4eb2-8c39-c81b8e61ddd2" alt=""><figcaption></figcaption></figure>

Через несколько секунд после нахождения совпадения участники переходят к `status:HOST_ASSIGNED`  что означает, что ваш [развертывание уже готово, а ваш игровой сервер инициализируется](https://docs.edgegap.com/ru/learn/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-3.-deployment-ready).

Каждый игрок читает свой `ticket_id`  и  `назначение`  и пытаются подключиться, используя [**FQDN**](#user-content-fn-5)[^5] **(URL развертывания)** и **внешний порт**. В этот момент ваш игровой сервер может все еще инициализироваться, поэтому **игрокам нужно повторять попытку подключения несколько раз**, пока не будет превышено обычное время инициализации сервера:

{% tabs %}
{% tab title="Unreal Engine" %}
Чтобы **подключение из PIE (редактора)** во время разработки и тестирования нажмите клавишу тильды `~`  и введите `open {URL}:{port}`  и дождитесь, пока редактор загрузит карту.

Чтобы **подключение из сборки игрового клиента** (и в рабочей production-среде) попробуйте

* Unreal Engine [⚡ Integration Kit](https://docs.edgegap.com/learn/unreal-engine-games/developer-tools#integration-kit):
  * [установить из Fab Marketplace](https://www.fab.com/listings/ff17ad88-12a1-49cf-9a41-31695ed11e16) (бесплатно для личного использования),
  * [импортировать простой пример blueprint](https://blueprintue.com/blueprint/m33u1okj/) и настроить под свои нужды.

{% hint style="success" %}
В случае неудачного подключения или черного экрана обратитесь к нашему [руководству по устранению неполадок](/ru/unreal-engine.md#troubleshooting-and-faq).
{% endhint %}
{% endtab %}

{% tab title="Unity" %}
Чтобы **подключите ваш Unity Editor** или **игровой клиент** к вашему облачному развертыванию, укажите:

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

{% hint style="success" %}
В случае тайм-аута подключения или других проблем обратитесь к нашему [руководству по устранению неполадок](/ru/unity.md#troubleshooting-and-faq-4).
{% endhint %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Мы не просим игроков подтверждать матч, поскольку стремимся обеспечить как можно более короткое время до начала игры, высокий процент заполнения матчей и минимизировать уклонение от очереди и отмены матчей.
{% endhint %}

Игровые клиенты должны **сохранять свой ID назначения в постоянном хранилище между перезапусками игры**, чтобы в случае сбоя игрового клиента они могли получить данные подключения и попытаться переподключиться.

☑️ Попробуйте подключиться из вашего игрового клиента к назначенному серверу.

{% hint style="warning" %}
Если вы сталкиваетесь с высокой задержкой, ваша интеграция netcode может быть настроена на имитацию сетевой задержки. **Отключите VPN при тестировании** для более реалистичных условий и получите [развертывание с низкой задержкой](/ru/learn/orkestraciya/deployments.md#server-placement).
{% endhint %}

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

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

{% hint style="info" %}
Найдите спецификацию OpenAPI для тестирования по адресу `{matchmaker-url}/swagger/v1/swagger.json`.
{% endhint %}

### 5. Интеграция с игрой

Matchmaker интегрируется с:

* **Игровой клиент**, чтобы [управлять группами, участниками, назначениями и билетами](/ru/learn/matchmeiking/matchmaker-in-depth.md#group-up),
* **Выделенный сервер**, чтобы [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#backfill-match) после ухода игрока.

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

* Unity [Инструменты разработчика](/ru/unity/developer-tools.md#software-development-kit):
  * [установите пакет бесплатно с помощью Unity Package Manager](https://github.com/edgegap/edgegap-unity-sdk),
  * [изучите наше руководство для начала работы и полные примеры](/ru/unity/matchmaking.md).
* Unreal Engine [Инструменты разработчика](/ru/unreal-engine/developer-tools.md#integration-kit):
  * [прочитайте документацию](https://egik.betide.studio/) от Betide Studios,
  * [установите из Fab Marketplace](https://www.fab.com/listings/ff17ad88-12a1-49cf-9a41-31695ed11e16) (бесплатно для личного использования).

☑️ В **Игровой клиент**, убедитесь, что вы обрабатываете повторяемые `429 Too Many Requests`  ошибки с экспоненциальной задержкой и повторной попыткой, давая матчмейкеру время восстановиться во время внезапных всплесков трафика.

☑️ В **Игровой клиент**, убедитесь, что вы обрабатываете неповторяемые ошибки:

* `404 Not Found` - билет был удален,
* `500 Internal Server Error` - временный сбой сервиса.

☑️ В **Игровой сервер**, считывает предпочтения игрока и начальный контекст сервера:

1. [Внедренные переменные (Matchmaker)](/ru/learn/matchmeiking/matchmaker-in-depth.md#injected-environment-variables) **для получения начальных данных матчмейкинга игроков.**
2. [Внедренные переменные (версии приложения)](/ru/learn/orkestraciya/application-and-versions.md#other-parameters-optional) для параметров версии, настроек и секретов.
3. [Внедренные переменные (развертывание)](/ru/learn/orkestraciya/deployments.md#injected-environment-variables) для сведений о развертывании, IP, местоположении и т. д...

{% hint style="info" %}
Используйте [GetEnvironmentVariable в C#](https://learn.microsoft.com/en-us/dotnet/api/system.environment.getenvironmentvariable?view=net-8.0) или [GetEnvironmentVariable в C++](https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Core/GenericPlatform/FGenericPlatformMisc/GetEnvironmentVariable) чтобы получить значения переменных.
{% endhint %}

☑️ После подключения игроков, **Игровой сервер и игровые клиенты** запустите сцену загрузки — 3D-сцену, социальный интерфейс в стиле лобби или экран загрузки с индикатором прогресса, чтобы показать, что инициализация продолжается.

☑️ Убедитесь, что ваше [развертывание будет остановлено](https://docs.edgegap.com/docs/deployment#stop-a-deployment) корректно после завершения матча.

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

## 🏁 Расширенный пример

Полноценная конфигурация, использующая все возможности матчмейкинга, включая [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-profiles), [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-rules)и [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#rule-expansion) может выглядеть так:

<details>

<summary>🏁 Расширенный пример (Полная конфигурация примера)</summary>

```json
{
  "version": "3.3.3",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "allowed_cors_origins": [
    "https://*.my-game-server.com"
  ],
  "profiles": {
    "advanced-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 125
            }
          },
          "elo_rating": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 50
            }
          },
          "selected_game_mode": {
            "type": "string_equality"
          },
          "selected_map": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "elo_rating": {
              "max_difference": 150
            },
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          },
          "60": {
            "elo_rating": {
              "max_difference": 200
            }
          },
          "180": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            },
            "beacons": {
              "difference": 99999,
              "max_latency": 99999
            }
          }
        }
      }
    }
  }
}
```

</details>

## 🥛 Демонстрация backfill

Опираясь на [#simple-example](#simple-example "mention"), эта конфигурация демонстрирует [Backfill](/ru/learn/matchmeiking/matchmaker-in-depth.md#backfill-match) с [Группы](/ru/learn/matchmeiking/matchmaker-in-depth.md#group-up).

<details>

<summary><span data-gb-custom-inline data-tag="emoji" data-code="1f95b">🥛</span> Пример конфигурации backfill</summary>

```json
{
  "version": "3.3.3",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "backfill-example": {
      "ticket_expiration_period": "30s",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 100,
              "max_latency": 200
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {}
      }
    }
  }
}
```

</details>

При необходимости у некоторых игр могут быть особые требования к подбору игроков, например:

* позволять новым игрокам присоединяться к идущим играм (друзья или "случайные игроки"),
* заменять игроков, которые выходят (leavers) после запуска сервера, чтобы избежать перезапуска матча,
* позволять зрителям присоединяться и наблюдать за турнирными или дружескими матчами (киберспорт),
* собирать игроков на более крупных серверах, чтобы обеспечить больше социальных взаимодействий (MMO).

Бэкфилл — это **серверный билет, представляющий игроков, в данный момент подключённых к серверу.** Это гарантирует, что вновь добавленные игроки будут соблюдать ваши правила подбора при сопоставлении с текущими игроками.

{% hint style="warning" %}
[Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#backfill-match) для замены сессий Seat/Match. Матчмейкер поддерживает только сессию Default.
{% endhint %}

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FJhdLAJYga4z2sjxLj6LM%2FUntitled-2024-10-29-1018.png?alt=media&amp;token=279136ba-a15e-46b0-a119-8419b8aca044" alt=""><figcaption><p>Визуализация сценариев бэкфилла</p></figcaption></figure>

{% hint style="success" %}
**Бэкфиллы игнорируют** `player_count`  **правило и всегда сопоставляют ровно одну группу**. `backfill_group_size`  контролирует вместимость команды по стратегии round-robin, равномерно и управляемо заполняя команды.
{% endhint %}

**Шаги для успешного выполнения бэкфилла:**

1. Сервер должен создать по одному Backfill для каждой команды, которой не хватает игроков, используя значения из:
   * Реальные `назначение`  данные, полученные из [Развертывания](/ru/learn/orkestraciya/deployments.md#injected-environment-variables) (развёртывания).
   * Текущих подключённых игроков' `билеты`:
     * из [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#injected-variables) (матчмейкера), предыдущих бэкфиллов' `assigned_ticket` ответа или тестовых данных, изменённых для соответствия конкретным игрокам,
     * замените `backfill_group_size`  значения на возможные размеры группы [до доступной вместимости](#user-content-fn-6)[^6],
2. Игровые клиенты создают новые билеты (членства) и включают `backfill_group_size`  значения:
   * `"1"`  если игрок подбирается в одиночку.
   * [`"2"`  если игрок является частью группы подбора с общим количеством участников 2x](#user-content-fn-7)[^7].
   * `"new"`  если игроки включили возможность начинать новые игры в дополнение к присоединению к идущим играм.
3. Игровые клиенты переходят к [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#find-match) и сопоставляют игроков с подходящим бэкфиллом.
4. Если бэкфилленая группа не полностью заполнила команду, сервер может повторить этот процесс с билетами недавно добавленных игроков, чтобы добавить больше игроков и достичь нужного размера команды.

{% hint style="success" %}
Бэкфиллы игнорируют правила размера команды и всегда сопоставляют 1x бэкфилл с 1x группой. **Чтобы сопоставлять только с бэкфиллами и отключить сопоставление с другими игроками в очереди, задайте `min_team_size: 999999` .**
{% endhint %}

<details>

<summary>🥛 Пример бэкфилла (демонстрация бэкфилла)</summary>

```json
{
  "profile": "backfill-example",
  "атрибуты": {
    "assignment": {
      "request_id": "cd28e6c66554",
      "fqdn": "cd28e6c66554.pr.edgegap.net",
      "public_ip": "192.168.2.14",
      "ports": {
        "game": {
          "internal": 7777,
          "external": 56890,
          "link": "cd28e6c66554.pr.edgegap.net:56890",
          "protocol": "UDP"
        },
        "web": {
          "internal": 22,
          "external": 57440,
          "link": "cd28e6c66554.pr.edgegap.net:57440",
          "protocol": "TCP"
        },
        "server": {
          "internal": 80,
          "external": 50110,
          "link": "cd28e6c66554.pr.edgegap.net:50110",
          "protocol": "TCP"
        }
      },
      "location": {
        "city": "Montreal",
        "country": "Canada",
        "continent": "North America",
        "administrative_division": "Quebec",
        "timezone": "America/Toronto"
      }
    }
  },
  "tickets": {
    "c3d057h5h6f7j889fk43": {
      "player_ip": "174.25.48.238",
      "атрибуты": {
        "маяки": {
          "New York": 12.2,
          "Los Angeles": 45.3,
          "Paris": 78.3
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "192bb97e-7fd6-4d86-8ce4-61c53c9fef16",
      "id": "c3d057h5h6f7j889fk43",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    },
    "cqg0bg9583s738h9dkf6": {
      "player_ip": "217.34.85.142",
      "атрибуты": {
        "маяки": {
          "New York": 21.0,
          "Los Angeles": 30.2,
          "Paris": 101.1
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "aea7df3c-d391-4ea3-a3ec-dded422fe7c8",
      "id": "cqg0bg9583s738h9dkf6",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    }
  },
  "assigned_ticket": null
}
```

</details>

<details>

<summary>🥛 Пример назначения бэкфилла (демонстрация бэкфилла)</summary>

```json
{
  "profile": "backfill-example",
  "атрибуты": {
    "assignment": {
      "request_id": "cd28e6c66554",
      "fqdn": "cd28e6c66554.pr.edgegap.net",
      "public_ip": "192.168.2.14",
      "ports": {
        "game": {
          "internal": 7777,
          "external": 56890,
          "link": "cd28e6c66554.pr.edgegap.net:56890",
          "protocol": "UDP"
        },
        "web": {
          "internal": 22,
          "external": 57440,
          "link": "cd28e6c66554.pr.edgegap.net:57440",
          "protocol": "TCP"
        },
        "server": {
          "internal": 80,
          "external": 50110,
          "link": "cd28e6c66554.pr.edgegap.net:50110",
          "protocol": "TCP"
        }
      },
      "location": {
        "city": "Montreal",
        "country": "Canada",
        "continent": "North America",
        "administrative_division": "Quebec",
        "timezone": "America/Toronto"
      }
    }
  },
  "tickets": {
    "c3d057h5h6f7j889fk43": {
      "player_ip": "174.25.48.238",
      "атрибуты": {
        "маяки": {
          "New York": 12.2,
          "Los Angeles": 45.3,
          "Paris": 78.3
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "192bb97e-7fd6-4d86-8ce4-61c53c9fef16",
      "id": "c3d057h5h6f7j889fk43",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    },
    "cqg0bg9583s738h9dkf6": {
      "player_ip": "217.34.85.142",
      "атрибуты": {
        "маяки": {
          "New York": 21.0,
          "Los Angeles": 30.2,
          "Paris": 101.1
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "aea7df3c-d391-4ea3-a3ec-dded422fe7c8",
      "id": "cqg0bg9583s738h9dkf6",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    }
  },
  "assigned_ticket": {
    "profile": "backfill-example",
    "player_ip": "244.13.201.244",
    "атрибуты": {
      "маяки": {
        "New York": 30.2,
        "Los Angeles": 10.5,
        "Paris": 123.9
      },
      "backfill_group_size": [
        "new",
        "1"
      ]
    },
    "id": "cqg0bg550h7uujd77khg",
    "group_id": "e0cf41c0-f88f-456e-a032-03b1d6821a9a",
    "created_at": "2024-08-20T13:38:08.251393+00:00",
    "status": "HOST_ASSIGNED"
  }
}
```

</details>

{% hint style="info" %}
См. [Управление местами Mirror](https://docs.edgegap.com/docs/sample-projects/mirror-on-edgegap#bonus-seat-sessions-management) и [Управление местами FishNet](https://docs.edgegap.com/docs/sample-projects/fishnet-on-edgegap#bonus-seat-sessions-management) для **мониторинга подключений игроков**.
{% endhint %}

## ⚔️ Соревновательные игры

Соревновательные игры сосредоточены на том, что игроки соревнуются друг с другом ради победы — как поодиночке (free for all), так и командами. Обеспечьте честные и сбалансированные матчи, сопоставляя игроков или команды схожего уровня навыка, и поддерживайте темп игры, быстро находя честных соперников.

<details>

<summary>⚔️ Пример соревновательной игры</summary>

```json
{
  "version": "3.3.3",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "casual-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          },
          "180": {
            "beacons": {
              "difference": 99999,
              "max_latency": 99999
            }
          }
        }
      }
    },
    "competitive-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "versus_ranks": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "120": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          }
        }
      }
    },
    "challenger-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "elo_rating": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 50
            }
          }
        },
        "expansions": {
          "120": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          }
        }
      }
    }
  }
}
```

</details>

Вы можете **определять несколько команд, в каждой из которых 1 или более игроков**, например:

<table><thead><tr><th width="300">Игровой режим</th><th>Количество команд</th><th>Размер команды</th><th>Всего игроков</th></tr></thead><tbody><tr><td>5v5 FPS</td><td>2</td><td>5</td><td><strong>10</strong></td></tr><tr><td>5v5 MOBA</td><td>2</td><td>5</td><td><strong>10</strong></td></tr><tr><td>20x3 Battle Royale</td><td>20</td><td>3</td><td><strong>60</strong></td></tr><tr><td>10 игроков, каждый сам за себя</td><td>1</td><td>10</td><td><strong>10</strong></td></tr></tbody></table>

Определите несколько [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-profiles) для правил и настроек, специфичных для игрового режима, и [расширяйте по мере необходимости](/ru/learn/matchmeiking/matchmaker-in-depth.md#rule-expansion).

* **Для всех матчей:**
  * ограничьте [задержку матчмейкинга](/ru/learn/matchmeiking/matchmaker-in-depth.md#ping-optimization) чтобы не сопоставлять игроков, находящихся далеко,
  * [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#group-up) для заранее собранных групп и чтобы не превышать размер команды,
  * постепенно ослабляйте ограничения по задержке со временем, чтобы находить больше игроков,
  * выделяйте больше CPU или памяти с помощью разных [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md#app-versions) для конкретных профилей,
* **Для казуальных матчей:**
  * уберите ограничения по рангу, чтобы максимизировать скорость подбора и заполнение матчей,
  * позвольте игрокам указывать предпочтения по картам, чтобы найти карту, подходящую всем,
  * укажите размер группы backfill, чтобы заменять вышедших игроков, не превышая размер команды,
  * уберите ограничения по задержке, чтобы гарантировать матч после 3 минут (180 с) ожидания в очереди.
* **Для соревновательных матчей:**
  * ограничьте ранг, чтобы допускать только соперников со схожим уровнем навыка,
  * используйте ранги повышения или понижения, чтобы сопоставлять игроков на крайних уровнях рангов лиги.
* **Для топ-1% матчей высокого уровня навыка (challengers):**
  * используйте числовые рейтинги навыка (ELO), чтобы получить тонкий контроль над распределением навыка в матчах,
  * дольше ждите перед ослаблением требований к задержке из-за меньшего числа игроков.

{% hint style="success" %}
Использование нескольких профилей для **разделения казуальных игровых режимов, соревновательных режимов и элитных challenger** игроков позволяет настраивать правила и расширения отдельно для каждого типа игроков.
{% endhint %}

## 🤝 Кооперативные игры

Кооперативные игры требуют, чтобы игроки работали вместе как команда ради общей цели или против ИИ-соперника. Сопоставляйте игроков со схожими предпочтениями и стилем игры. Заменяйте игроков, которые уходят, и улучшайте [Пинг-маяки](/ru/learn/orkestraciya/ping-beacons.md#connection-quality) чтобы обеспечить отзывчивый игровой опыт.

<details>

<summary>🤝 Пример кооперативной игры</summary>

```json
{
  "version": "3.3.3",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "cooperative-example": {
      "ticket_expiration_period": "3m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "selected_difficulty": {
            "type": "string_equality"
          },
          "selected_map": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "player_level": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 10
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "moderation_flags": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            },
            "player_level": {
              "max_difference": 20
            }
          },
          "60": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 2,
              "max_team_size": 4
            }
          },
          "150": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            }
          }
        }
      }
    }
  }
}
```

</details>

При количестве команд 1 и максимальном размере команды 4, **требуйте до 4 игроков на матч**.

Определите несколько [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-profiles) для правил и настроек, специфичных для игровых режимов:

* начинайте минимум с 4 игроков, чтобы удерживать игроков в очереди и максимизировать заполнение матчей,
* ограничьте [задержку матчмейкинга](/ru/learn/matchmeiking/matchmaker-in-depth.md#ping-optimization) чтобы не сопоставлять игроков, находящихся далеко,
* позвольте игрокам выбирать определенную сложность игры в соответствии с уровнем навыка каждого,
* позвольте игрокам указывать предпочтения по картам, чтобы найти карту, подходящую всем,
* ограничьте разницу в уровнях игроков, чтобы требовать схожую степень прогресса в игре,
* укажите размер группы backfill, чтобы заменять вышедших игроков, не превышая вместимость сервера,
* используйте флаги модерации, чтобы отделять игроков с низкой кармой и читеров от общей аудитории,
* [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#group-up) для заранее собранных групп и чтобы заполнять команды, не превышая вместимость сервера,
* выделяйте больше CPU или памяти, используя разные [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md#app-versions) для других профилей.

Начните с идеальных условий и [расширяйте ограничения](/ru/learn/matchmeiking/matchmaker-in-depth.md#rule-expansion) чтобы обеспечить быстрые матчи:

* со временем ослабляйте ограничения по задержке, чтобы находить больше игроков,
* увеличивайте допустимую разницу в уровнях игроков, чтобы находить больше игроков,
* уменьшайте минимальный размер команды, чтобы требовать меньше игроков и начинать игру раньше,
  * сервер может заполнять пустые слоты союзниками ИИ,
  * или [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#backfill-match) чтобы добавить игроков позже,
* установите минимальный размер команды 1, чтобы запустить игру в одиночку после 150 с ожидания в очереди.

## 🎈 Социальные игры

Социальные игры сосредоточены на построении связей и отношений между игроками через сотрудничество, общение и общий опыт. Поддерживайте большое число игроков, максимизируйте заполнение матчей и учитывайте предпочтения игроков и их стиль игры. Заменяйте игроков, которые уходят, и обеспечьте высокий [Пинг-маяки](/ru/learn/orkestraciya/ping-beacons.md#connection-quality) чтобы обеспечить отзывчивый игровой опыт.

<details>

<summary>🎈 Пример социальной игры</summary>

```json
{
  "version": "3.3.3",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "social-example": {
      "ticket_expiration_period": "3m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "attributes": {
              "team_count": 1,
              "min_team_size": 50,
              "max_team_size": 50
            },
            "type": "player_count"
          },
          "beacons": {
            "attributes": {
              "difference": 125,
              "max_latency": 150
            },
            "type": "latencies"
          },
          "selected_mode": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "moderation_flags": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "15": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            },
            "match_size": {
              "team_count": 1,
              "min_team_size": 20,
              "max_team_size": 50
            }
          },
          "30": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 10,
              "max_team_size": 50
            }
          },
          "150": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 50
            }
          }
        }
      }
    }
  }
}
```

</details>

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

Определите [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#matchmaking-profiles) для правил и настроек, специфичных для игровых режимов:

* ограничьте [задержку матчмейкинга](/ru/learn/matchmeiking/matchmaker-in-depth.md#ping-optimization) чтобы не сопоставлять игроков, находящихся далеко,
* позвольте игрокам указывать предпочтения по игровым режимам и находить режим, подходящий всем,
* укажите размер группы backfill, чтобы заменять вышедших игроков, не превышая вместимость сервера,
* используйте флаги модерации, чтобы отделять игроков с низкой кармой и читеров от общей аудитории,
* [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#group-up) для заранее созданных лобби или чтобы заполнить команды, не превышая вместимость сервера,
* выделяйте больше CPU или памяти, используя разные [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md#app-versions) для других профилей.

Начните с идеальных условий и [расширяйте ограничения](/ru/learn/matchmeiking/matchmaker-in-depth.md#rule-expansion) чтобы обеспечить быстрые матчи:

* со временем ослабляйте ограничения по задержке, чтобы находить больше игроков,
* постепенно уменьшайте минимальный размер команды, чтобы требовать меньше игроков и начинать игру раньше,
  * сервер может заполнять пустые слоты игроками ИИ,
  * или [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#backfill-match) чтобы добавить игроков позже,
* установите минимальный размер команды 1, чтобы запустить игру в одиночку после 150 с ожидания в очереди.

[^1]: замените на имя вашего приложения

[^2]: замените на версию вашего приложения

[^3]: превышена максимальная разница

[^4]: превышена максимальная задержка

[^5]: Fully Qualified Domain Name

[^6]: например, для 3 свободных слотов = \["3", "2", "1"]

[^7]: замените "2" на количество фактических участников группы
