# 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](/docs.edgegap.com-fr/unity.md) 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](/docs.edgegap.com-fr/unity.md).

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](/docs.edgegap.com-fr/unity/developer-tools.md#dedicated-servers-quickstart-plugin),
* en production dans le client de jeu, récupérez-la depuis [matchmaking / affectation de ticket / fqdn](/docs.edgegap.com-fr/learn/matchmaking/matchmaker-in-depth.md#player-api):
  * voir aussi [démarrage avec le Matchmaking](/docs.edgegap.com-fr/learn/matchmaking.md).

{% 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/docs/sample-projects/unity-netcodes/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-1.-server-score-strategy-best-practice) lors de l'utilisation de nos [plugins](/docs.edgegap.com-fr/unity/developer-tools.md) ou [API](/docs.edgegap.com-fr/docs/api/serveurs-dedies.md) donc en production, définir la région Photon Cloud n'est pas requis.

</details>


---

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