# Exemples de transport

Après avoir géré vos joueurs avec un matchmaker ou des lobbys puis créé une session de relais pour eux en utilisant l'API Edgegap, vous devrez connecter vos joueurs au relais une fois qu'il est prêt. Edgegap propose un transport spécifique pour faire cela, et ce guide vous montrera comment l'implémenter dans votre projet. Le transport est disponible [ici sur notre GitHub](https://github.com/edgegap/distributed-relay-examples/tree/main).

Avec Unity, il existe actuellement une version du transport pour les netcodes suivants :

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

### Ajout du transport

Après avoir téléchargé le transport approprié pour votre netcode, vous devez l'inclure dans votre projet. Tout d'abord, ajoutez-le à vos fichiers de projet à l'emplacement suivant :

* **Mirror** : ajoutez le `Edgegap` dossier sous `Assets/Mirror/Transports`;
* **Fishnet** : ajoutez le `Edgegap KcpTransport` dossier sous `Assets/Fishnet/Plugins`;
* **NGO** : ajoutez le `EdgegapRelay` et `kcp2k` dossiers sous `Assets/Edgegap`.

Ensuite, ajoutez le `EdgegapKcpTransport` script à votre `NetworkManager` gameObject, assurez-vous également de faire glisser ce nouveau composant dans la `propriété Transport` du gameObject.

{% hint style="info" %}
Si l'option est présente, assurez-vous de désactiver `la GUI Relay` dans le `EdgegapKcpTransport` composant du `NetworkManager`. Sinon, il interférera lors de la tentative de connexion au relais.

Cette option est notamment présente dans les versions Mirror et NGO du transport.
{% endhint %}

### Connexion au relais

Après le matchmaking et la création de la session de relais, utilisez l'API Edgegap pour déterminer quand le relais est prêt à accepter des connexions. Une fois prêt, utilisez les données fournies dans la réponse de l'API pour définir les valeurs du transport. Vous aurez besoin des valeurs suivantes dans les champs appropriés :

* le `IP` adresse est utilisée comme `l'adresse du relais du transport`;
* le `token d'autorisation de session` est utilisé comme `l'ID de session du transport`;
* le `token d'autorisation de l'utilisateur` est utilisé comme `ID utilisateur du transport`.

#### Connexion Serveur/Hôte

* le `port du serveur` la valeur est utilisée comme `le port du relais du transport` .

#### Connexion Client

* le `port client` la valeur est utilisée comme `le port du relais du transport` .

{% hint style="info" %}
Chaque joueur aura son propre token d'autorisation unique, mais le token de session restera identique pour chaque joueur de la session.
{% endhint %}

### Utilisation avec Mirror

```cs
// `data` est la réponse API désérialisée convertie en JSON
// `_EdgegapTransport` est l'EdgegapKcpTransport

// Convertir uint? en uint
uint sessionAuthorizationToken = data.authorization_token ?? 0;

//TODO trouver quel utilisateur de session correspond au joueur, `i` étant sa position dans la liste
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
);

// puis `NetworkManager.Singleton.StartHost();` si joueur hôte
// OU `NetworkManager.Singleton.StartClient();` si client 
```

### Utilisation avec Fishnet

```cs
// `data` est la réponse API désérialisée convertie en JSON
// `_transport` est l'EdgegapKcpTransport

// Convertir uint? en uint
uint sessionAuthorizationToken = data.authorization_token ?? 0;

//TODO trouver quel utilisateur de session correspond au joueur, `i` étant sa position dans la liste
uint userAuthorizationToken = data.session_users?[i].authorization_token ?? 0;

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);

// puis `_transport.StartConnection(true);` si hôte
// OU `_transport.StartConnection(false);` si client
```

### Utilisation avec NGO

```cs
// `data` est la réponse API désérialisée convertie en JSON
// `_EdgegapTransport` est l'EdgegapKcpTransport

// Convertir uint? en uint
uint sessionAuthorizationToken = data.authorization_token ?? 0;

//TODO trouver quel utilisateur de session correspond au joueur, `i` étant sa position dans la liste
uint userAuthorizationToken = data.session_users?[i].authorization_token ?? 0;

_EdgegapTransport.relayAddress = data.relay.ip;
_EdgegapTransport.relayGameClientPort = data.relay.ports.client.port;
_EdgegapTransport.relayGameServerPort = data.relay.ports.server.port;
_EdgegapTransport.sessionId = sessionAuthorizationToken;
_EdgegapTransport.userId = userAuthorizationToken;

// puis `NetworkManager.Singleton.StartHost();` si joueur hôte
// OU `NetworkManager.Singleton.StartClient();` si client 
```

### Utilisation d'ApiResponse

```cs
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; }
}
```

Une fois que les valeurs sont correctement définies, utilisez le transport pour connecter chaque joueur au relais. Après un court instant, vous pourrez jouer au jeu !

### Projets d'exemple

Les projets suivants sont de simples exemples qui utilisent le transport de relais Edgegap.

Pour qu'ils fonctionnent correctement, ouvrez un terminal de commande et téléchargez le projet via la commande `git clone [URL]` Ouvrez le dossier du projet dans l'éditeur via Unity Hub, puis modifiez la `valeur RelayProfileToken` dans le `HelloWorldManager` composant du `NetworkManager` gameObject par votre propre token de profil de relais.

* [Exemple Mirror](https://github.com/edgegap/unity-mirror-relay-sample)
* [Exemple Fishnet](https://github.com/edgegap/unity-fishnet-relay-sample)
* [Exemple NGO](https://github.com/edgegap/unity-ngo-relay-sample)

{% hint style="info" %}
Utilisez votre [token de profil de relais](https://app.edgegap.com/relay-management/dashboard) dans l’en-tête `HelloWorldManager.cs` ou `EdgegapRelayService.cs`.
{% endhint %}
