# Photon Fusion 2

Découvrez comment héberger des projets Unity sur Edgegap en utilisant des techniques du [Exemple Fusion 2 Asteroids](https://doc.photonengine.com/fusion/current/game-samples/fusion-asteroids).

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

## ✔️ Préparation

Avant de commencer, vous aurez besoin de :

* Unity 6 - [télécharger via Unity Hub](https://unity.com/releases/unity-6),
* Projet exemple Fusion 2 Asteroids (modifié pour Edgegap) - [télécharger depuis GitHub](https://github.com/edgegap/netcode-sample-photon-fusion-2).

## ⚡ Déployer et se connecter

### 1. Déployer un serveur sur Edgegap

☑️ Pour commencer, vous devrez [créer un compte gratuit chez Edgegap](https://app.edgegap.com/auth/register). Aucune carte de crédit requise.

☑️ [Créez une nouvelle version d'application pour votre application](https://app.edgegap.com/application-management/applications/fusion-2-asteroids-sample/versions/create), choisissez Fusion 2 Asteroids Sample.

☑️ Ouvrez votre nouveau projet dans Unity.

☑️ Allez dans Tools / Edgegap Hosting, puis à l'étape 6. Déployer un serveur sur Edgegap.

☑️ Appuyez sur Deploy to cloud et [ouvrez les détails de votre nouveau déploiement](https://app.edgegap.com/deployment-management/deployments/list).

☑️ Trouvez les informations de connexion uniques et à usage unique de votre déploiement :

* **URL de l'hôte** au format `780aa4260e83.pr.edgegap.net` .

✅ Vous pouvez maintenant passer à l'étape suivante.

### 2. Se connecter depuis l'éditeur

☑️ Ouvrez votre nouveau projet dans Unity.

☑️ Appuyez sur le bouton ▶️ Play pour lancer votre client de jeu.

☑️ Saisissez l'URL de l'hôte (détails de connexion de l'étape précédente) comme nom de salle.

☑️ Appuyez sur le bouton Start Edgegap pour vous connecter à votre serveur.

☑️ Connectez un deuxième joueur virtuel avec [Multiplayer Play Mode](https://docs-multiplayer.unity3d.com/mppm/current/about/) ou [ParrelSync](https://github.com/VeriorPies/ParrelSync).

🙌 Félicitations pour votre premier déploiement sur Edgegap !

## ✏️ Personnaliser la build du serveur

{% hint style="success" %}
Voir [unity](https://docs.edgegap.com/docs.edgegap.com-fr/unity "mention") pour Unity afin de **apprendre comment construire et personnaliser les serveurs**.
{% endhint %}

### Créer une application sur Photon

{% hint style="info" %}
Pour faciliter la démo initiale, nous avons utilisé un compte Photon Cloud gratuit détenu par Edgegap.
{% endhint %}

☑️ [Créez un compte gratuit chez Photon](https://dashboard.photonengine.com/).

☑️ [Créer une application sur Photon](https://dashboard.photonengine.com/app/create):

* `Jeu multijoueur`,
* `Fusion` SDK Photon,
* `Fusion 2` version du SDK.

☑️ Trouvez votre ID d'application au format `85314a99-56fc-4ab3-ba26-50efca09f303` .

☑️ Saisissez votre ID dans Photon Settings sous Tools / Fusion / Fusion Hub (Alt + F).

### Intégrer le projet Fusion 2 avec Edgegap

{% hint style="success" %}
Voir `EdgegapServerManager.cs`  script pour un exemple d'intégration de Fusion 2 avec Edgegap.
{% endhint %}

{% hint style="warning" %}
Votre `NetworkProjectConfig`  **doit utiliser `Peer Mode = Single` (Serveur déd.)**, pas `Multiple` (Client-Hôte) !
{% endhint %}

Les clients de jeu se connecteront aux serveurs de jeu via [Photon Fusion 2 ](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/matchmaking#creating-and-joining-a-game-session)[Session (salle) ](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/matchmaking#creating-and-joining-a-game-session)[fonctionnalité](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/matchmaking#creating-and-joining-a-game-session).

Votre serveur de jeu doit enregistrer son adresse IP et son port externe avec le nom de session, lors de l'appel de `_runnerInstance.StartGame(StartGameArgs args)`:

* utilisez `GameMode.Server`  pour vous assurer que votre connexion n'est pas relayée via Photon Cloud (ajoute de la latence),
* utilisez `NetAddress.CreateFromIpPort` méthode de Fusion,
* fournir l'adresse IP du serveur :\
  `Environment.GetEnvironmentVariable("ARBITRIUM_PUBLIC_IP")`
* fournir le port externe du serveur :\
  `Environment.GetEnvironmentVariable("ARBITRIUM_PORT_GAMEPORT_EXTERNAL")`
  * c'est le nom de mappage de port par défaut si vous utilisez notre [plugin Unity pour empaqueter votre serveur](https://docs.edgegap.com/docs.edgegap.com-fr/unity).

Utilisez l'URL d'hôte du déploiement Edgegap comme nom de session :

* dans le serveur de jeu, obtenez-la avec\
  `$"{Environment.GetEnvironmentVariable("ARBITRIUM_REQUEST_ID")}.pr.edgegap.net"`
* lors du test du client de jeu, récupérez-la depuis le tableau de bord - page des détails du déploiement / URL de l'hôte
  * créez des déploiements pour tests depuis notre [plugin d'hébergement quickstart](https://docs.edgegap.com/docs.edgegap.com-fr/unity/developer-tools#dedicated-servers-quickstart-plugin),
* en production dans le client de jeu, récupérez-la depuis [matchmaking / affectation de ticket / fqdn](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement/matchmaker-in-depth#player-api):
  * voir aussi [démarrage avec le Matchmaking](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement).

{% tabs %}
{% tab title="Intégration client" %}
{% code title="EdgegapClientManager.cs" %}

```csharp
// obtenir le network runner de fusion 2
_runnerInstance = FindFirstObjectByType<NetworkRunner>();
_runnerInstance.ProvideInput = true;

// obtenir cette valeur depuis l'assignation du matchmaker Edgegap ou l'API Sessions de Fusion 2
string sessionName = "<requestId.pr.edgegap.net>";

// trouver la session fusion 2 (en utilisant le nom de session)
var result = await _runnerInstance.StartGame(
    new StartGameArgs() {
        GameMode = GameMode.Client,
        SessionName = sessionName,
        ObjectProvider = _runnerInstance.GetComponent<NetworkObjectPoolDefault>(),
    }
);

// fusion récupérera maintenant l'IP et le port du serveur en fonction du nom de session et se connectera
```

{% endcode %}
{% endtab %}

{% tab title="Intégration serveur" %}
{% code title="EdgegapServerManager.cs" %}

```csharp
// lire les variables d'environnement injectées par Edgegap
string requestId = Environment.GetEnvironmentVariable("ARBITRIUM_REQUEST_ID");
string listenPort = Environment.GetEnvironmentVariable("ARBITRIUM_PORT_GAMEPORT_INTERNAL");
string connectIP = Environment.GetEnvironmentVariable("ARBITRIUM_PUBLIC_IP");
string connectPort = Environment.GetEnvironmentVariable("ARBITRIUM_PORT_GAMEPORT_EXTERNAL");

// obtenir le network runner de fusion 2
_runnerInstance = FindFirstObjectByType<NetworkRunner>();
_runnerInstance.ProvideInput = true;

// enregistrer la session fusion 2 pour que les clients puissent la retrouver plus tard (en utilisant le nom de session)
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),
    }
);

// charger la scène initiale
if (result.Ok && _runnerInstance.IsServer) {
    await _runnerInstance.LoadScene(sceneName);
}
```

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

### Dépannage

<details>

<summary><code>Le jeu n'existe pas (32758)</code></summary>

* Les salles Photon exigent que le joueur se connecte à la région Photon Cloud où le déploiement est situé. Le déploiement depuis le tableau de bord utilise une IP de joueur aléatoire.
* Vous devrez peut-être trouver l'emplacement du déploiement sur la carte, et configurer votre client de jeu dans Assets / Photon / Fusion / Resources / PhotonAppSettings.asset avec la [région Photon Cloud](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/regions#photon-cloud-for-gaming).
* Edgegap [déploie aussi près que possible du joueur](https://docs.edgegap.com/docs.edgegap.com-fr/learn/orchestration/deployments#id-1.-server-score-strategy-best-practice) lors de l'utilisation de nos [plugins](https://docs.edgegap.com/docs.edgegap.com-fr/unity/developer-tools) ou [API](https://docs.edgegap.com/docs.edgegap.com-fr/docs/api/serveurs-dedies) donc en production, définir la région Photon Cloud n'est pas requis.

</details>
