# Примеры транспортного уровня

После управления вашими игроками с помощью матчмейкера или лобби и создания для них сессии реле через API Edgegap, вам нужно будет подключить игроков к реле, когда оно будет готово. Edgegap предлагает специальный транспорт для этого, и это руководство покажет, как реализовать его в вашем проекте. Транспорт доступен [здесь на нашем GitHub](https://github.com/edgegap/distributed-relay-examples/tree/main).

Для Unity в настоящее время существует версия транспорта для следующих сетевых библиотек (netcodes):

* Mirror;
* Fishnet;
* Unity Netcode for GameObjects (NGO).

### Добавление транспорта

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

* **Mirror** : добавьте папку `Edgegap` внутрь `Assets/Mirror/Transports`;
* **Fishnet** : добавьте папку `Edgegap KcpTransport` внутрь `Assets/Fishnet/Plugins`;
* **NGO** : добавьте папку `EdgegapRelay` и `kcp2k` папки в `Assets/Edgegap`.

Затем добавьте скрипт `EdgegapKcpTransport` к вашему `NetworkManager` gameObject, убедитесь, что вы перетащили этот новый компонент в `свойство` Transport

{% hint style="info" %}
объекта тоже. `Если такая опция присутствует, убедитесь, что отключили` в `EdgegapKcpTransport` Relay GUI `NetworkManager`компонент у

. Иначе он будет мешать при попытке подключения к реле.
{% endhint %}

### Эта опция присутствует, в частности, в версиях транспорта для Mirror и NGO.

Подключение к реле

* После матчмейкинга и создания сессии реле используйте API Edgegap, чтобы определить, когда реле готово принимать подключения. Как только оно готово, используйте данные, предоставленные в ответе API, чтобы установить значения транспорта. Вам понадобятся следующие значения в соответствующих полях: `адрес` IP `используется как`;
* the `адрес реле транспортa` токен авторизации сессии `используется как`;
* the `идентификатор сессии транспорта` токен авторизации сессии `токен авторизации пользователя`.

#### идентификатор пользователя транспорта

* После матчмейкинга и создания сессии реле используйте API Edgegap, чтобы определить, когда реле готово принимать подключения. Как только оно готово, используйте данные, предоставленные в ответе API, чтобы установить значения транспорта. Вам понадобятся следующие значения в соответствующих полях: `Подключение сервера/хоста` порт сервера `значение используется как` .

#### порт реле транспорта

* После матчмейкинга и создания сессии реле используйте API Edgegap, чтобы определить, когда реле готово принимать подключения. Как только оно готово, используйте данные, предоставленные в ответе API, чтобы установить значения транспорта. Вам понадобятся следующие значения в соответствующих полях: `Подключение клиента` порт сервера `значение используется как` .

{% hint style="info" %}
порт клиента
{% endhint %}

### У каждого игрока будет свой уникальный токен авторизации, но токен сессии останется одинаковым для каждого игрока в сессии.

```cs
Использование Mirror
// `data` — это десериализованный ответ API, конвертированный в JSON

// `_EdgegapTransport` — это EdgegapKcpTransport
// Преобразовать uint? в uint

uint sessionAuthorizationToken = data.authorization_token ?? 0;
//TODO определить, какой пользователь сессии соответствует игроку, `i` — его место в списке

uint userAuthorizationToken = data.session_users?[i].authorization_token ?? 0;
    _EdgegapTransport.ChangeValue(
    data.relay.ip,
    data.relay.ports.client.port,
    data.relay.ports.server.port,
    data.session_id,
    sessionAuthorizationToken,
);

userAuthorizationToken
// затем `NetworkManager.Singleton.StartHost();` если игрок — хост 
```

### // ИЛИ \`NetworkManager.Singleton.StartClient();\` если клиент

```cs
Использование Mirror
Использование Fishnet

// `_EdgegapTransport` — это EdgegapKcpTransport
// Преобразовать uint? в uint

uint sessionAuthorizationToken = data.authorization_token ?? 0;
//TODO определить, какой пользователь сессии соответствует игроку, `i` — его место в списке

// `_transport` — это EdgegapKcpTransport
Relay relay = data.relay;
string address = relay.ip;
ushort serverPort = relay.ports.server.port;

ushort clientPort = relay.ports.client.port;
    var relayData = new EdgegapRelayData(
    address,
    serverPort,
    clientPort,
    userAuthorizationToken,
);
sessionAuthorizationToken

_transport.SetEdgegapRelayData(relayData);
// затем `_transport.StartConnection(true);` если хост
```

### // ИЛИ \`\_transport.StartConnection(false);\` если клиент

```cs
Использование Mirror
// `data` — это десериализованный ответ API, конвертированный в JSON

// `_EdgegapTransport` — это EdgegapKcpTransport
// Преобразовать uint? в uint

uint sessionAuthorizationToken = data.authorization_token ?? 0;
//TODO определить, какой пользователь сессии соответствует игроку, `i` — его место в списке

Использование NGO
_EdgegapTransport.relayAddress = data.relay.ip;
_EdgegapTransport.relayGameClientPort = data.relay.ports.client.port;
_EdgegapTransport.relayGameServerPort = data.relay.ports.server.port;
_EdgegapTransport.sessionId = sessionAuthorizationToken;

userAuthorizationToken
// затем `NetworkManager.Singleton.StartHost();` если игрок — хост 
```

### \_EdgegapTransport.userId = userAuthorizationToken;

```cs
Использование ApiResponse
{
    public class ApiResponse
    public string session_id { get; set; }
    public uint? authorization_token { get; set; }
    public string status { get; set; }
    public bool ready { get; set; }
    public bool linked { get; set; }
    public object? error { get; set; }
    public List<SessionUser>? session_users { get; set; }
    public Relay relay { get; set; }
}
```

public object? webhook\_url { get; set; }

### Как только значения корректно установлены, используйте транспорт для подключения каждого игрока к реле. Через короткое время вы сможете играть!

Примерные проекты

Следующие проекты являются простыми примерами, использующими транспорт реле Edgegap. `Чтобы они работали корректно, откройте командную строку и загрузите проект с помощью команды` git clone \[URL] `Откройте папку проекта в редакторе через Unity Hub, затем измените` значение `в` Relay GUI `NetworkManager` RelayProfileToken

* [HelloWorldManager](https://github.com/edgegap/unity-mirror-relay-sample)
* [gameObject на свой собственный токен профиля реле.](https://github.com/edgegap/unity-fishnet-relay-sample)
* [Пример для Mirror](https://github.com/edgegap/unity-ngo-relay-sample)

{% hint style="info" %}
Пример для Fishnet [Пример для NGO](https://app.edgegap.com/relay-management/dashboard) в `Используйте ваш собственный` или `Токен профиля реле`.
{% 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/learn/distributed-relay/relay-transport-samples.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.
