> 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/docs/sample-projects/unity-netcodes/photon-fusion-2-on-edgegap.md).

# Photon Fusion 2

Узнайте, как размещать проекты Unity на Edgegap, используя техники из [примера Fusion 2 Asteroids Sample](https://doc.photonengine.com/fusion/current/game-samples/fusion-asteroids).

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

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

Перед началом вам понадобится:

* Unity 6 - [загрузите через Unity Hub](https://unity.com/releases/unity-6),
* Проект-пример Fusion 2 Asteroids Sample (изменён для Edgegap) - [скачать с GitHub](https://github.com/edgegap/netcode-sample-photon-fusion-2).

## ⚡ Развернуть и подключить

### 1. Разверните сервер на Edgegap

☑️ Чтобы начать, вам нужно [создать бесплатный аккаунт в Edgegap](https://app.edgegap.com/auth/register). Кредитная карта не требуется.

☑️ [Создайте новую версию приложения для своего приложения](https://app.edgegap.com/application-management/applications/fusion-2-asteroids-sample/versions/create), выберите Fusion 2 Asteroids Sample.

☑️ Откройте ваш новый проект в Unity.

☑️ Перейдите в Tools / Edgegap Hosting, затем к шагу 6. Разверните сервер на Edgegap.

☑️ Нажмите Deploy to cloud и [откройте детали нового развертывания](https://app.edgegap.com/deployment-management/deployments/list).

☑️ Найдите уникальные одноразовые данные подключения вашего развертывания:

* **Host URL** в формате `780aa4260e83.pr.edgegap.net` .

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

### 2. Подключение из редактора

☑️ Откройте ваш новый проект в Unity.

☑️ Нажмите кнопку ▶️ Play, чтобы запустить игровой клиент.

☑️ Введите Host URL (данные подключения из предыдущего шага) как имя комнаты.

☑️ Нажмите кнопку Start Edgegap, чтобы подключиться к вашему серверу.

☑️ Подключите второго виртуального игрока с помощью [Multiplayer Play Mode](https://docs-multiplayer.unity3d.com/mppm/current/about/) или [ParrelSync](https://github.com/VeriorPies/ParrelSync).

🙌 Поздравляем с вашим первым развертыванием на Edgegap!

## ✏️ Настройка сборки сервера

{% hint style="success" %}
См. [Unity](/ru/unity.md) для Unity, чтобы **узнать, как собирать и настраивать серверы**.
{% endhint %}

### Создайте приложение в Photon

{% hint style="info" %}
Чтобы сделать начальную демо-версию проще, мы использовали бесплатный аккаунт Photon Cloud, принадлежащий Edgegap.
{% endhint %}

☑️ [Создайте бесплатный аккаунт в Photon](https://dashboard.photonengine.com/).

☑️ [Создайте приложение в Photon](https://dashboard.photonengine.com/app/create):

* `Многопользовательская игра`,
* `Fusion` SDK Photon,
* `Fusion 2` версия SDK.

☑️ Найдите ID вашего приложения в формате `85314a99-56fc-4ab3-ba26-50efca09f303` .

☑️ Введите свой ID в Photon Settings в разделе Tools / Fusion / Fusion Hub (Alt + F).

### Интеграция проекта Fusion 2 с Edgegap

{% hint style="success" %}
См. `EdgegapServerManager.cs`  скрипт с примером интеграции Fusion 2 с Edgegap.
{% endhint %}

{% hint style="warning" %}
Ваш `NetworkProjectConfig`  **должен использовать `Peer Mode = Single` (Ded. Server)**, а не `Multiple` (Client-Host)!
{% endhint %}

Игровые клиенты будут подключаться к игровым серверам через [Photon Fusion 2 ](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/matchmaking#creating-and-joining-a-game-session)[сессию (комнату) ](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/matchmaking#creating-and-joining-a-game-session)[функцию](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/matchmaking#creating-and-joining-a-game-session).

Ваш игровой сервер должен зарегистрировать свой IP-адрес и внешний порт вместе с именем сессии при вызове `_runnerInstance.StartGame(StartGameArgs args)`:

* используйте `GameMode.Server`  чтобы ваше соединение не проходило через Photon Cloud (это добавляет задержку),
* используйте `NetAddress.CreateFromIpPort` метод из Fusion,
* предоставьте IP-адрес сервера:\
  `Environment.GetEnvironmentVariable("ARBITRIUM_PUBLIC_IP")`
* предоставьте внешний порт сервера:\
  `Environment.GetEnvironmentVariable("ARBITRIUM_PORT_GAMEPORT_EXTERNAL")`
  * это имя сопоставления портов по умолчанию, если вы используете наш [плагин Unity для упаковки вашего сервера](/ru/unity.md).

Используйте Host URL развертывания Edgegap в качестве имени сессии:

* в игровом сервере получите его с помощью\
  `$"{Environment.GetEnvironmentVariable(\"ARBITRIUM_REQUEST_ID\")}.pr.edgegap.net"`
* при тестировании игрового клиента получите его с панели управления — на странице деталей развертывания / Host URL
  * создавайте развертывания для тестирования из нашего [плагина быстрого старта хостинга](/ru/unity/developer-tools.md#dedicated-servers-quickstart-plugin),
* в рабочем игровом клиенте получите его из [сопоставления / назначения билета / fqdn](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#player-api):
  * см. также [начало работы с Matchmaking](/ru/learn/podbor-igrokov.md).

{% tabs %}
{% tab title="Интеграция клиента" %}
{% code title="EdgegapClientManager.cs" %}

```csharp
// получить сетевой runner Fusion 2
_runnerInstance = FindFirstObjectByType<NetworkRunner>();
_runnerInstance.ProvideInput = true;

// получите это значение из назначения Edgegap Matchmaker или API Fusion 2 Sessions
string sessionName = "<requestId.pr.edgegap.net>";

// найти сессию Fusion 2 (используя имя сессии)
var result = await _runnerInstance.StartGame(
    new StartGameArgs() {
        GameMode = GameMode.Client,
        SessionName = sessionName,
        ObjectProvider = _runnerInstance.GetComponent<NetworkObjectPoolDefault>(),
    }
);

// теперь Fusion получит IP-адрес и порт сервера на основе имени сессии и подключится
```

{% endcode %}
{% endtab %}

{% tab title="Интеграция сервера" %}
{% code title="EdgegapServerManager.cs" %}

```csharp
// прочитайте внедрённые Edgegap переменные окружения
string requestId = Environment.GetEnvironmentVariable("ARBITRIUM_REQUEST_ID");
string listenPortStr = Environment.GetEnvironmentVariable("ARBITRIUM_PORT_GAMEPORT_INTERNAL");
string connectIP = Environment.GetEnvironmentVariable("ARBITRIUM_PUBLIC_IP");
string connectPort = Environment.GetEnvironmentVariable("ARBITRIUM_PORT_GAMEPORT_EXTERNAL");

// получить сетевой runner Fusion 2
_runnerInstance = FindFirstObjectByType<NetworkRunner>();
_runnerInstance.ProvideInput = true;

// преобразуйте порт прослушивания в ushort, как ожидает StartGame
ushort.TryParse(listenPortStr, out ushort listenPort);

// зарегистрируйте сессию Fusion 2, чтобы клиенты могли найти её позже (используя имя сессии)
var result = await _runnerInstance.StartGame(
    new StartGameArgs() {
        GameMode = GameMode.Server,
        SessionName = $"{requestId}.pr.edgegap.net",
        ObjectProvider = _runnerInstance.GetComponent<NetworkObjectPoolDefault>(),
        Address = NetAddress.Any(listenPort),
        CustomPublicAddress = NetAddress.CreateFromIpPort(connectIP, connectPort),
    }
);

// загрузите начальную сцену
if (result.Ok && _runnerInstance.IsServer) {
    await _runnerInstance.LoadScene(sceneName);
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Устранение неполадок

<details>

<summary><code>Игра не существует (32758)</code></summary>

* Комнаты Photon требуют, чтобы игрок подключался к региону Photon Cloud, где расположен развёрнутый сервер. Развёртывание из панели управления использует случайный IP-адрес игрока.
* Вам может потребоваться найти местоположение развертывания на карте и настроить ваш игровой клиент в Assets / Photon / Fusion / Resources / PhotonAppSettings.asset с соответствующим [регионом Photon Cloud](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/regions#photon-cloud-for-gaming).
* Edgegap [разворачивает сервер как можно ближе к игроку](https://docs.edgegap.com/ru/docs/sample-projects/unity-netcodes/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-1.-server-score-strategy-best-practice) при использовании наших [плагинов](/ru/unity/developer-tools.md) или [API](/ru/docs/api/vydelennye-servery.md) поэтому в продакшене настройка региона Photon Cloud не требуется.

</details>
