# Unity - Premiers pas

Apprenez en pratiquant et déployez votre premier serveur dédié sur Edgegap. À la fin de ce guide, vous aurez déployé un serveur dédié avec Edgegap gratuitement.

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

## ✔️ Préparation

<details>

<summary><a href="https://github.com/edgegap/edgegap-unity-plugin">Installez le plugin de démarrage rapide des serveurs dédiés Unity d’Edgegap</a></summary>

</details>

{% hint style="info" %}
**Confiant dans vos builds de serveur ?** Passez à [#customize-server-image](#customize-server-image "mention") ou [Fonctionnalités avancées](/docs.edgegap.com-fr/learn/advanced-features.md) pour en savoir plus.
{% endhint %}

## ⚙️ 1. Connecter le compte

☑️ Connectez-vous et vérifiez qu’il n’y a aucune nouvelle erreur dans votre console Unity liée au plugin d’Edgegap.

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

<details>

<summary>Dépannage et FAQ</summary>

`!Success: 400 BAD REQUEST - POST | https://api.edgegap.com/v1/wizard/init-quick-start - {"message": "The browser (or proxy) sent a request that this server could not understand."}`

* Si vous avez installé en copiant le fichier ZIP ou utilisé un projet d’exemple avec une copie du plugin installée de cette manière, vous devrez installer manuellement les dépendances du package, y compris la bibliothèque Newtonsoft JSON, voir [le dépôt officiel des plugins](https://github.com/edgegap/edgegap-unity-plugin/tree/main?tab=readme-ov-file#instructions-1).
* Veuillez nous contacter sur [Discord communautaire](https://discord.gg/NgCnkHbsGp) pour obtenir de l’aide si ce n’est pas le cas.

</details>

## 🔧 2. Compiler le serveur de jeu

Que vous utilisiez une machine Windows, Mac ou Linux, vous **devrez compiler votre serveur pour l’exécution Linux**, car la plupart des fournisseurs cloud aujourd’hui (y compris Edgegap) fonctionnent sous Linux. Ne vous inquiétez pas, aucune connaissance de Linux n’est requise pour réaliser cela avec notre plugin.

☑️ **Vérifiez que vous avez installé les outils de compilation Linux Unity requis.**

☑️ Modifiez les paramètres de compilation pour **vous assurer que toutes les scènes de jeu requises sont incluses**.

{% hint style="info" %}
**Utilisateurs avancés de Unity** - modifiez éventuellement [les paramètres de compilation Unity](https://docs.unity3d.com/Manual/BuildSettings.html). Attention ! Cela peut casser votre build.
{% endhint %}

☑️ Optionnel : ajoutez le script spécifique au netcode pour la vérification des ports et l’initialisation de l’environnement à votre scène serveur initiale depuis le menu Edgegap Server Hosting (clic droit / :heavy\_plus\_sign: dans votre fenêtre Hierarchy).

<figure><img src="/files/e242caec08e4a1898927f09cf447e78fc04f0fc4" alt="" width="360"><figcaption></figcaption></figure>

{% hint style="info" %}
Une fois que vous avez terminé l’étape [#id-6.-deploy-a-server-on-edgegap](#id-6.-deploy-a-server-on-edgegap "mention"), le script de vérification du port enregistrera un avertissement si l’adresse ou les ports de votre netcode ne correspondent pas à votre [mappage des ports de la version de l’application](/docs.edgegap.com-fr/learn/orchestration/application-and-versions.md#other-parameters-optional) .
{% endhint %}

{% hint style="success" %}
Les builds serveur doivent utiliser l’adresse `0.0.0.0`  et le port `7777`  dans votre transport netcode. Si vous personnalisez votre port, veuillez indiquer le même dans votre [Applications et versions](/docs.edgegap.com-fr/learn/orchestration/application-and-versions.md#port-mapping) une fois que vous [#id-5.-upload-to-edgegap](#id-5.-upload-to-edgegap "mention").
{% endhint %}

☑️ Une fois que vous êtes satisfait de votre configuration, cliquez sur **Compiler le serveur**, attendez la fin du processus et vérifiez qu’il n’y a aucune nouvelle erreur dans votre console Unity. L’achèvement de cette étape fera apparaître un **nouveau dossier dans la racine de votre projet** - `Builds/EdgegapServer/ServerBuild` .

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

<details>

<summary>Dépannage et FAQ</summary>

Unity : les seules cibles autonomes prises en charge sont Windows x64 et OSX avec OpenXR.

* Ouvrez vos packages et désactivez OpenXR avant de compiler votre serveur.
* Le plugin OpenXR est uniquement requis pour les clients et n’est pas compatible avec les builds serveur Linux. En l’excluant de vos builds serveur, vous ne perdez aucune fonctionnalité.

</details>

## 🐋 3. Conteneuriser le serveur

Travailler en équipe de développeurs signifie partager votre code. Quand les choses tournent mal, la dernière chose que vous voulez entendre est « ça marche sur ma machine ». Les serveurs de jeu doivent fonctionner de manière fiable sur n’importe quelle machine, car les serveurs d’un jeu à succès tourneront sur des milliers de machines à travers le monde.

Pour rendre votre serveur fiable, nous utilisons Docker - un logiciel de virtualisation qui garantit que toutes les dépendances de votre code serveur, jusqu’au niveau du système d’exploitation, seront toujours exactement les mêmes, peu importe comment ou où le serveur est lancé.

☑️ Pour l’instant, commencez par cliquer sur le bouton **Valider** pour vous assurer que vous avez terminé [Outils pour développeurs](/docs.edgegap.com-fr/unity/developer-tools.md#usage-requirements).

☑️ Vous pouvez configurer les options suivantes (ou conserver les valeurs par défaut) :

* **Le chemin de build** est le chemin relatif vers l’artefact de build de votre serveur, conservons la valeur par défaut pour l’instant.

{% hint style="warning" %}
**Conservez les builds dans le dossier de votre projet**, Docker n’accepte que des chemins de build relatifs à la racine du projet.
{% endhint %}

* **Nom de l’image** est un identifiant unique de votre choix, servant d’étiquette à votre build serveur avant la mise en production.
  * En général, cela inclura le nom de votre jeu - par exemple « my-game-server ».
* **Tag de l’image** est un identifiant pointant vers une version spécifique de votre image.
  * Le terme « artefact de build » est parfois utilisé pour désigner une version spécifique de votre image.
  * Les horodatages sont une excellente option pour les tags, par exemple `2024.01.30-16.23.00-UTC` .
* **Chemin vers le Dockerfile** peut être utilisé pour personnaliser la recette de vos images.
  * Nous vous recommandons de conserver le paramètre par défaut pour l’instant, vous pourrez en savoir plus plus tard dans la section [#customize-server-image](#customize-server-image "mention").
* **Paramètres de build Docker optionnels** peuvent être utilisés pour fournir à Docker des instructions supplémentaires sur des nuances plus fines.
  * Nous vous recommandons de conserver le paramètre par défaut pour l’instant, vous pouvez [en savoir plus plus tard dans la documentation Docker](https://docs.docker.com/reference/cli/docker/image/build/#options).

☑️ Une fois que vous êtes satisfait de votre configuration, cliquez sur **Conteneuriser avec Docker**, attendez la fin du processus et vérifiez qu’il n’y a aucune nouvelle erreur dans votre console Unity. L’achèvement de cette étape fera apparaître un **une nouvelle image apparaissant sur votre machine locale**. Vous pouvez le vérifier soit dans Docker Desktop, dans l’onglet Images sous Local (par défaut), soit dans le CLI docker en exécutant `docker images` .

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

<details>

<summary>Dépannage et FAQ</summary>

`/bin/bash : docker : commande introuvable` , ou `impossible de trouver Packages\com.edgegap.unity-servers-plugin\Editor`

* Tout d’abord, assurez-vous d’avoir terminé [Outils pour développeurs](/docs.edgegap.com-fr/unity/developer-tools.md#usage-requirements).
* Confirmez que vous avez vérifié votre compte Edgegap, vous devriez avoir reçu un lien de vérification par e-mail.
* Certains paramètres ont peut-être été réinitialisés après la mise à jour de Docker Desktop. Essayez d’aller dans les paramètres de Docker Desktop / Avancé et, pour « Choisir comment configurer l’installation des outils CLI de Docker : », sélectionnez « Système (mot de passe requis) ».

***

`docker build nécessite exactement 1 argument`

* Veuillez vérifier que le tag de votre image ne contient aucun caractère d’espacement (espaces, tabulations). Retaper la valeur de votre tag d’image vous permettra de vous assurer que vous n’avez pas copié accidentellement de tels caractères.

***

`(code HTTP 400) inattendu - format de tag invalide`

* Il s’agit d’un [problème connu avec Docker macOS version 4.33](https://github.com/docker/for-win/issues/14258), veuillez envisager de revenir à la version 4.32 ou de mettre à jour vers la 4.35.

***

`ERROR: failed to solve: ubuntu:22.04: failed to resolve source metadata for http://docker.io/library/ubuntu:22.04: failed to authorize: failed to fetch oauth token`

* Êtes-vous situé en Chine ? Votre connexion peut être interrompue par le Grand Pare-feu. Essayez d’exécuter `docker pull ubuntu:22.04` manuellement dans votre ligne de commande (ouvrez la ligne de commande en appuyant sur Win+R, puis tapez `cmd` et Entrée).

***

`System.IndexOutOfRangeException: L’index était hors des limites du tableau.`

* Si vous avez installé notre plugin de démarrage rapide Unity en téléchargeant le ZIP, le cache de votre Unity Editor est peut-être corrompu. Essayez de supprimer votre copie du plugin et d’installer à l’aide de l’URL git ou depuis l’Unity Asset Store. Vous ne devriez plus avoir besoin du package Newtonsoft.JSON car il est automatiquement inclus avec les autres sources.

***

La taille de mon image Docker est énorme (plus de 1 Go) / minuscule (moins de 100 Mo), est-ce normal ?

* Cela peut être acceptable dans certains cas, tant que vous pouvez exécuter le serveur et vous connecter avec succès (voir [#id-4.-test-your-server-locally](#id-4.-test-your-server-locally "mention")). Si ce n’est pas le cas, envisagez de revoir vos options de build, de les réinitialiser aux valeurs par défaut, puis d’ajouter progressivement des options pour voir comment elles affectent la taille de votre build. Voir aussi [#optimize-server-build-size](#optimize-server-build-size "mention").

***

Je rencontre un autre problème qui n’est mentionné nulle part dans cette documentation.

* Tout d’abord, veuillez essayer [de mettre à jour votre plugin Edgegap](https://github.com/edgegap/edgegap-unity-plugin?tab=readme-ov-file#update-the-plugin-in-unity) car nous avons peut-être publié une correction. Si cela n’aide pas, veuillez nous contacter sur notre [Discord communautaire](https://discord.gg/NgCnkHbsGp) et nous enquêterons rapidement avec vous.

</details>

## 🧪 4. Tester le serveur localement

☑️ Vous pouvez configurer les options suivantes (ou conserver les valeurs par défaut) :

* **Tag de l’image serveur** de l’étape précédente.
  * Par défaut, utilise le dernier tag que vous avez compilé avec le plugin.
* **Paramètres optionnels de docker run** peuvent être fournis pour exposer plusieurs ports ou exécuter votre image sur des machines macOS.
  * Vous pouvez publier plusieurs ports pour votre conteneur si nécessaire, il suffit d’ajouter le paramètre `-p {port interne}/{protocole}` pour chacun, par exemple `-p 8080/tcp -p 7777/udp` pour publier et mapper votre port serveur `8080` vers un port externe aléatoire pour une connexion TCP et le port serveur `7777` vers un port externe aléatoire pour une connexion UDP en même temps.
  * **Trouvez la configuration du port serveur dans votre transport ou dans les paramètres spécifiques au netcode.**
  * Si vous utilisez une machine avec architecture ARM (macOS M1, M2, M3, etc.), vous devriez voir ce paramètre optionnel inclus dans vos Paramètres optionnels de build Docker : `--platform=linux/amd64` .

☑️ Une fois que vous êtes satisfait de votre configuration, cliquez sur **Déployer le conteneur local**, attendez la fin du processus et vérifiez qu’il n’y a aucune nouvelle erreur dans votre console Unity. L’achèvement de cette étape fera apparaître un **nouveau conteneur démarré** sur votre machine de développement.

{% hint style="info" %}
Pour plus de détails, voir Docker Desktop / Containers, ou la commande CLI Docker `docker ps` .
{% endhint %}

☑️ Il est maintenant temps de **connecter votre client de jeu Unity Editor à votre conteneur Docker local** pour vérifier que l’image de votre serveur fonctionne correctement. Trouvez les paramètres de votre client netcode et saisissez :

* `localhost` ou `0.0.0.0` (équivalent dans la plupart des cas) à la place de l’IP du serveur,
* valeur du port externe aléatoire trouvée dans Docker Desktop / Containers / edgegap-server-test.

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

<details>

<summary>Dépannage et FAQ</summary>

Je n’arrive pas à me connecter au conteneur Docker local avec mon client de jeu Unity Editor.

* Tout d’abord, assurez-vous que le statut du conteneur est Up et qu’il n’est pas en Restarting ou Exited, ce qui indiquerait une exception à l’exécution. Si votre conteneur ne s’exécute pas, inspectez ses journaux via l’onglet Containers de Docker Desktop (cliquez sur votre conteneur) ou en utilisant `docker logs {container_id} --timestamps` via le CLI docker.
* Ensuite, veuillez vérifier que le paramètre de port de votre Network Manager depuis le build de votre serveur correspond au port publié dans **Paramètres optionnels de docker run**. Si ce n’est pas le cas, essayez de réinitialiser ou de modifier manuellement la valeur de ce champ pour qu’elle corresponde à `{container}` port à votre paramètre Network Manager. Trouvez votre protocole dans vos paramètres netcode.
* Enfin, confirmez que les paramètres netcode de votre client de jeu Unity Editor utilisent le port publié dans **Paramètres optionnels de docker run** (voir la capture d’écran ci-dessus).

***

`(erreur de segmentation) - core dumped`

* Si vous utilisez une machine avec architecture ARM (macOS M1, M2, M3, etc.), vous devriez voir ce paramètre optionnel inclus dans vos Paramètres optionnels de build Docker : `--platform=linux/amd64` . Si ce n’est pas le cas, essayez de réinitialiser la valeur de ce champ.

***

`SceneId 9120233082191360994 introuvable dans SceneObjects.`

* Cela peut signifier que la scène que vous essayez de charger n’a pas été correctement incluse dans le build, un problème connu dans les anciennes versions du plugin. Pour y remédier, veuillez essayer de mettre à jour votre version d’intégration netcode ou [de mettre à jour votre plugin Edgegap](https://github.com/edgegap/edgegap-unity-plugin?tab=readme-ov-file#update-the-plugin-in-unity).

***

`http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed`

* Il s’agit d’un [problème connu avec les anciennes versions de Docker Desktop pour Windows](https://github.com/docker/for-win/issues/13611). Veuillez mettre à jour votre application Docker Desktop et réessayer de conteneuriser.

***

`Curl error 35: échec de la poignée de main du certificat. Erreur fatale. Code d’erreur UnityTls : 7`

* Cette erreur indique un problème de validation du certificat racine SSL, un problème connu dans les anciennes versions du plugin. Pour y remédier, veuillez essayer [de mettre à jour votre plugin Edgegap](https://github.com/edgegap/edgegap-unity-plugin?tab=readme-ov-file#update-the-plugin-in-unity).

</details>

## ☁️ 5. Téléverser vers Edgegap

☑️ Vous pouvez configurer les options suivantes (ou conserver les valeurs par défaut) :

* **Nom de l’application** sur Edgegap peut correspondre au nom de votre image ou être personnalisé.
  * Nous avons choisi de copier le nom de votre image pour l’instant.
* **Version de l’application** sur Edgegap peut correspondre à votre tag ou être personnalisé.
  * Les horodatages sont une excellente option pour les noms de version d’application, par exemple `2024.01.30-16.50.20-UTC` .
  * Plusieurs versions d’application peuvent pointer vers le même tag d’image, comme `v1.1.0` et `dev` .
  * En savoir plus sur [Applications et versions](/docs.edgegap.com-fr/learn/orchestration/application-and-versions.md) plus tard.
* **Nom de l’image serveur** de l’étape [#id-3.-containerize-your-game-server](#id-3.-containerize-your-game-server "mention").
* **Tag de l’image serveur** de l’étape [#id-3.-containerize-your-game-server](#id-3.-containerize-your-game-server "mention").

{% hint style="success" %}
Trouvez n’importe quel nom et tag d’image stockés sur votre machine dans **Docker Desktop / Images**.
{% endhint %}

☑️ Une fois que vous êtes satisfait de votre configuration, cliquez sur **Téléverser l’image et créer une version d’application**, attendez la fin du processus et vérifiez qu’il n’y a aucune nouvelle erreur dans votre console Unity.

☑️ Vous serez redirigé vers notre [Tableau de bord](https://app.edgegap.com/), où vous pourrez configurer des paramètres optionnels. L’achèvement de cette étape entraînera la création d’une [nouvelle version d’application](https://app.edgegap.com/application-management/applications/list), et votre [artefact de build sera étiqueté et téléversé vers le registre de conteneurs d’Edgegap](https://app.edgegap.com/registry-management/repositories/list).

☑️ Vous serez maintenant invité à définir un port pour votre nouvelle version d’application. Assurez-vous de définir la même valeur de port serveur qu’à l’étape [#id-4.-test-your-server-locally](#id-4.-test-your-server-locally "mention") depuis vos paramètres de transport ou spécifiques au netcode.

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

## 🚀 6. Déployer sur le cloud

☑️ Maintenant, nous allons effectuer le test final et **connecter votre client de jeu Unity Editor à votre déploiement cloud**. Saisissez les détails de connexion du client de jeu depuis le déploiement :

* **Hôte** **URL** pointant vers l’IP du serveur, généralement dans le composant `NetworkManager` .
* **Port externe** mappé au [port d’écoute interne du serveur](/docs.edgegap.com-fr/learn/orchestration/application-and-versions.md#port-mapping), généralement dans le composant Transport.

<details>

<summary>Dépannage et FAQ</summary>

Impossible de connecter les clients au serveur - `Délai de requête dépassé.` , `请求超时` , `Connexion échouée` , ou `Vérification du port échouée`

* Tout d’abord, assurez-vous que le déploiement est Ready, et qu’il n’y a aucune exception à l’exécution ni aucune erreur dans le journal de votre déploiement. Si votre déploiement s’est arrêté, inspectez les journaux dans notre [Tableau de bord](https://app.edgegap.com/deployment-management/deployments/list).
* Si vous utilisez le netcode Mirror, vous devez avoir [« Auto Start Server »](https://mirror-networking.gitbook.io/docs/hosting/edgegap-hosting-plugin-guide#build-and-push) sélectionné dans votre `NetworkManager` , reconstruisez, publiez et redéployez votre serveur.
* Si vous utilisez le netcode FishNet, vous devez activer [« Start on Headless »](https://fish-networking.gitbook.io/docs/manual/components/managers/server-manager#settings-are-general-settings-related-to-the-servermanager) dans votre `ServerManager`, reconstruisez, publiez et redéployez votre serveur.
* Si vous utilisez le netcode Photon Fusion 2, veuillez vous assurer que votre serveur transmet l’IP publique du déploiement, le port externe et le `roomCode` sur le serveur, ainsi que le même code de salle dans le client dans le paramètre [« NeworkRunner.StartGame »](https://doc.photonengine.com/fusion/current/manual/network-runner#creating-or-joining-a-room) paramètre `StartGameArgs`. L’ID de déploiement (par ex. `b63e6003b19f`) est un excellent choix car il est mondialement unique et facilement accessible au client via [Matchmaker](/docs.edgegap.com-fr/learn/matchmaking/matchmaker-in-depth.md) et [Vue approfondie](/docs.edgegap.com-fr/learn/matchmaking/matchmaker-in-depth.md#injected-environment-variables).
* Ensuite, veuillez vérifier que le paramètre de port dans les paramètres netcode de votre build serveur correspond au port interne dans votre [Version de l’application](https://app.edgegap.com/application-management/applications/list). Vous pouvez modifier le mappage des ports en éditant le [Version de l’application](https://app.edgegap.com/application-management/applications/list) sans reconstruire. Trouvez votre protocole dans votre intégration netcode.
* Veuillez vous assurer que votre client de jeu se connecte au **port externe** affiché sur la page de détails de votre déploiement, cette valeur sera toujours aléatoire pour des raisons de sécurité.
* Si vous utilisez le protocole Secure Websocket (WSS) dans votre intégration netcode, veuillez vous assurer que votre [Version de l’application](https://app.edgegap.com/application-management/applications/list) configuration du port WSS a l’option TLS Upgrade activée.
* Êtes-vous situé en Chine et utilisez-vous [Smart Fleets](https://docs.edgegap.com/docs/deployment/session/fleet-manager/fleet)? Votre connexion peut être bloquée par le Grand Pare-feu. Envisagez d’ajouter à votre flotte un serveur situé en Chine, ou d’utiliser un VPN pour vous connecter.

***

Mon déploiement s’est arrêté/redémarré et je ne peux plus accéder à ses journaux.

* Dans le cas où le processus serveur plante à cause d’une exception, notre système tentera de redémarrer automatiquement le serveur. Envisagez [de tester votre serveur localement](#id-4.-test-your-server-locally) pour identifier la cause racine.
* Nous conservons les journaux uniquement pendant la durée du déploiement ; si vous souhaitez inspecter les journaux après l’arrêt du déploiement, veuillez [intégrer un stockage de journaux tiers](https://docs.edgegap.com/docs/deployment/endpoint-storage).
* Voir [/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-5.-deployment-stopped](https://docs.edgegap.com/docs.edgegap.com-fr/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-5.-deployment-stopped "mention") pour découvrir toutes les causes d’arrêt de votre déploiement.

***

Mon déploiement s’est arrêté automatiquement après X minutes.

* Les déploiements Free Tier ont une limite de 60 minutes, veuillez envisager de mettre à niveau votre compte.
* Tous les déploiements seront terminés après 24 heures d’exécution conformément à notre politique de nettoyage des serveurs, pour la maintenance de l’infrastructure, et pour éviter d’engendrer des coûts inattendus lorsque le déploiement n’a pas été arrêté correctement. Pour les serveurs de longue durée, envisagez d’utiliser [Flottes privées](/docs.edgegap.com-fr/learn/orchestration/flottes-privees.md) avec [Persistance](/docs.edgegap.com-fr/learn/orchestration/persistance.md).
* Voir [/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-5.-deployment-stopped](https://docs.edgegap.com/docs.edgegap.com-fr/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-5.-deployment-stopped "mention") pour découvrir toutes les causes d’arrêt de votre déploiement.

***

Mon déploiement est prêt mais je ne parviens pas à m’y connecter pendant plusieurs minutes ensuite.

* Une fois qu’un déploiement est Ready, l’initialisation de votre moteur de jeu commence. Ce processus peut prendre de quelques secondes à plusieurs minutes, et le serveur n’accepte pas les connexions des joueurs pendant cette période.
* Envisagez d’optimiser l’initialisation de votre serveur pour réduire cette durée.
* Les clients de jeu devraient réessayer la connexion toutes les 1 seconde pendant une durée limitée (selon votre durée d’initialisation), après quoi ils devraient revenir au matchmaking.
* Envisagez d’ajouter une scène de chargement afin que le serveur puisse effectuer l’initialisation (et le voyage dans le cas d’Unreal Engine) en même temps que les clients, tout en synchronisant l’état des deux.

***

Mon appareil Meta Quest renvoie `HTTP 0: Impossible de résoudre l’hôte de destination` .

* Lors de la compilation d’applications Unity pour la cible Android, votre permission d’accès à Internet peut être supprimée automatiquement de l’artefact de build client APK de sortie.
* Rajoutez les permissions dans (reconstruire le client ensuite requis) :
  * Paramètres du projet / OpenXR / :gear: Support Meta Quest / Supprimer de force les permissions Internet (décochez).
  * Paramètres du joueur / Accès Internet (définir sur requis).

***

Que se passera-t-il si un joueur quitte mon déploiement ?

* Par défaut, les serveurs ne rejettent pas les connexions des joueurs. L’authentification des joueurs dépend de vos développeurs, car de nombreuses méthodes différentes et fournisseurs d’authentification des joueurs peuvent être utilisés.
* Les clients de jeu peuvent stocker localement les informations de connexion afin de tenter une reconnexion en cas de crash inattendu du client.
* Pour permettre aux joueurs de rejoindre des parties en cours, envisagez d’utiliser [Vue approfondie](/docs.edgegap.com-fr/learn/matchmaking/matchmaker-in-depth.md#backfill) ou [Sessions](https://docs.edgegap.com/docs/deployment/session).

***

Mon serveur affiche une utilisation CPU de 100 % après être devenu prêt.

* Cela peut ne pas être un problème, car les moteurs de jeu ont tendance à effectuer des opérations gourmandes en CPU pendant l’initialisation du serveur. Si l’utilisation CPU ne baisse pas après 2 à 3 minutes depuis le début du déploiement, vous devrez peut-être optimiser votre serveur ou augmenter les ressources de la version de l’application.
* Réduire le tick rate peut avoir un impact sur l’utilisation CPU, car le serveur effectue moins d’opérations de messagerie.
* Si vous utilisez le netcode Mirror, vous devez avoir [« Auto Start Server »](https://mirror-networking.gitbook.io/docs/hosting/edgegap-hosting-plugin-guide#build-and-push) sélectionné dans votre `NetworkManager` , reconstruisez, publiez et redéployez votre serveur.
* Si vous utilisez le netcode FishNet, vous devez activer [« Start on Headless »](https://fish-networking.gitbook.io/docs/manual/components/managers/server-manager#settings-are-general-settings-related-to-the-servermanager) dans votre `ServerManager`, reconstruisez, publiez et redéployez votre serveur.
* Vous êtes limité à 1,5 vCPU et 3 Go de mémoire (RAM) en Free Tier.
* Vous pouvez augmenter les ressources allouées lors de la création d’une nouvelle version d’application. Vous pouvez dupliquer votre version d’application dans notre Tableau de bord et ajuster ces valeurs selon vos besoins, sans reconstruire votre serveur ni votre image.

***

Mon déploiement redémarre de façon répétée et affiche l’erreur `OOM kill`

* Cela est causé par un dépassement de la quantité de mémoire allouée. Envisagez d’optimiser l’utilisation de la mémoire avec le pooling d’objets, la compression ou la suppression des objets inutiles dans votre scène.
* Assurez-vous que votre projet charge la scène par défaut contenant votre `NetworkManager` et que la scène est incluse dans les paramètres de build Unity.
* Vous êtes limité à 1,5 vCPU et 3 Go de mémoire (RAM) en Free Tier.
* Vous pouvez augmenter les ressources allouées lors de la création d’une nouvelle version d’application. Vous pouvez dupliquer votre version d’application dans notre Tableau de bord et ajuster ces valeurs selon vos besoins, sans reconstruire votre serveur ni votre image.

***

Parfois, l’utilisation de la mémoire (RAM) de mon serveur monte en pic à une valeur élevée, est-ce un problème ?

* Tant que vous restez dans la quantité de mémoire allouée à la version de l’application, ce n’est pas un problème.
* Dépasser la quantité de mémoire allouée à la version de l’application provoquera `OOM kill` (voir ci-dessus).

***

Les performances de mon serveur seront-elles affectées par d’autres serveurs exécutés sur la même machine ?

* Non, notre plateforme garantit que les ressources allouées ne seront pas utilisées par d’autres studios ni par d’autres serveurs sur l’infrastructure partagée. Avec Edgegap, il n’y a pas de voisins bruyants.

</details>

## 👉 Prochaines étapes

### Arrêter les déploiements

Découvrez diverses méthodes pour [arrêter les déploiements](https://docs.edgegap.com/docs.edgegap.com-fr/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-5.-deployment-stopped) une fois que le match se termine et que les joueurs partent.

Pour des arrêts propres, nous recommandons vivement d’implémenter l’API d’auto-arrêt dans votre jeu :

<details>

<summary>Exemple de code de l’API d’auto-arrêt Unity C#</summary>

```csharp
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class EdgegapSelfStop : MonoBehaviour
{
    private const int MaxRetries = 2;
    private const int TimeoutSeconds = 30;
    private string url = Environment.GetEnvironmentVariable("ARBITRIUM_DELETE_URL");
    private string token = Environment.GetEnvironmentVariable("ARBITRIUM_DELETE_TOKEN");

    public void Run()
    {
        StartCoroutine(SendDeleteWithRetry());
    }

    private IEnumerator SendDeleteWithRetry()
    {
        if (string.IsNullOrEmpty(url))
        {
            Debug.LogError("Edgegap | ARBITRIUM_DELETE_URL is not set.");
            yield break;
        }

        if (string.IsNullOrEmpty(token))
        {
            Debug.LogError("Edgegap | ARBITRIUM_DELETE_TOKEN is not set.");
            yield break;
        }

        int attempt = 0;

        while (attempt <= MaxRetries)
        {
            attempt++;

            using (UnityWebRequest request = UnityWebRequest.Delete(url))
            {
                request.timeout = TimeoutSeconds;
                request.SetRequestHeader("Authorization", token);

                yield return request.SendWebRequest();

                if (request.result == UnityWebRequest.Result.Success)
                {
                    Debug.Log("Edgegap | DELETE request succeeded.");
                    yield break;
                }

                Debug.LogWarning(
                    $"Edgegap | DELETE attempt {attempt} failed.\n" +
                    $"Result: {request.result}, Error: {request.error}"
                );

                if (attempt == MaxRetries)
                {
                    Debug.LogError("Edgegap | DELETE request failed after all retries.");
                    yield break;
                }
            }
        }
    }
}
```

</details>

{% hint style="info" %}
Votre serveur Unity sera redémarré automatiquement en cas de crash ou de manque de mémoire.
{% endhint %}

### Variables injectées

Lisez des informations utiles comme l’ID de déploiement, l’adresse IP du serveur, l’emplacement du serveur, et plus encore ; en accédant aux variables d’environnement injectées. Chaque déploiement inclut automatiquement :

* [Variables de déploiement](/docs.edgegap.com-fr/learn/orchestration/deployments.md#injected-environment-variables) - fournies automatiquement par Edgegap,
* [Variables de matchmaking](/docs.edgegap.com-fr/learn/matchmaking/matchmaker-in-depth.md#injected-environment-variables) - fournies automatiquement par Edgegap lors de l’utilisation de [Matchmaking](/docs.edgegap.com-fr/learn/matchmaking.md),
* [Variables de version d’application](/docs.edgegap.com-fr/learn/orchestration/application-and-versions.md#injected-variables) - paires clé-valeur personnalisées configurables par vous.

**Vérifiez si l’instance actuelle est un client de jeu ou un serveur** en vérifiant si la variable Edgegap est définie :

```csharp
if (
  string.IsNullOrEmpty(Environment.GetEnvironmentVariable("ARBITRIUM_REQUEST_ID"))
)
{
  // code client
} else {
  // code serveur
}
```

### Sessions

Démarrer vos déploiements manuellement, coller l’URL et les ports ne suffira pas pour un jeu en production.

{% hint style="success" %}
[**En savoir plus sur le matchmaking**](/docs.edgegap.com-fr/learn/matchmaking.md) **pour déployer automatiquement, juste à temps**, lorsque les joueurs se connectent.
{% endhint %}

### Optimiser les builds serveur

**Reconstruisez uniquement les assets qui ont changé depuis le dernier build.**

Envisagez d’utiliser [les builds incrémentiels de Unity](https://docs.unity3d.com/Manual/incremental-build-pipeline.html) pour accélérer votre temps de build.

* Envisagez d’utiliser [les builds incrémentiels de Unity](https://docs.unity3d.com/Manual/incremental-build-pipeline.html) pour accélérer votre temps de build.

**N’incluez que ce qui est absolument nécessaire au fonctionnement de votre serveur.**

* Copier des fichiers inutilisés dans vos images entraîne un gonflement de l’image, des uploads plus longs, des vitesses de cache plus lentes et un démarrage global du serveur plus lent. [Consultez les सुझाव d’optimisation des images Docker](https://docs.docker.com/build-cloud/optimization/#dockerignore-files).

**Désactivez le batching statique des meshes pour réduire la taille de l’image.**

* [Désactivez le batching statique pour des builds, des uploads et des déploiements plus rapides.](https://docs.unity3d.com/Manual/DrawCallBatching.html)

**Compressez les meshes pour réduire la taille de l’image.**

* [Réglez la compression des meshes sur High pour des builds, des uploads et des déploiements plus rapides.](https://docs.unity3d.com/6000.0/Documentation/Manual/compressing-mesh-data-optimization.html)
* La compression des vertices n’a pas d’impact sur la taille de l’image.

**Mettez en œuvre un chargement paresseux conditionnel des ressources.**

* Excluez les assets réservés au client en [désactivant la lecture/écriture CPU pour les textures et les meshes](https://docs.unity3d.com/6000.0/Documentation/Manual/dedicated-server-optimizations.html).
* Envisagez d’utiliser [Unity Addressables](https://docs.unity3d.com/Packages/com.unity.addressables@2.1/manual/index.html) pour vos builds client afin d’accélérer les builds et les déploiements en [chargeant les assets juste à temps](https://docs.unity3d.com/Packages/com.unity.addressables@1.19/manual/LoadingAddressableAssets.html)ou en ignorant le chargement de certains assets dans les builds serveur en vérifiant la présence de [Déploiements](/docs.edgegap.com-fr/learn/orchestration/deployments.md#injected-environment-variables).

**Envisagez d’utiliser** [**builds Docker multi-étapes (lien)**](https://docs.docker.com/build/building/multi-stage/)**.**

* Séparez les grosses dépendances du serveur dans une image distincte pour les réutiliser dans des builds multi-étapes. Docker mettra en cache chaque couche et réutilisera simplement la version précédente en ignorant le téléversement de cette partie, sauf instruction contraire, ce qui vous fera économiser de la bande passante et du temps d’attente pendant la fin de l’upload.
* Si vous n’êtes pas sûr de savoir pourquoi l’une des commandes de votre Dockerfile génère une erreur, essayez de déboguer localement. Créez une nouvelle étape juste avant que le problème ne se produise (ajoutez un deuxième `FROM` commande), utilisez `--target` pour indiquer au processus de build de s’arrêter à l’étape problématique, puis `docker exec -it {container} /bin/bash` pour entrer dans un terminal interactif à l’intérieur de votre conteneur. Ensuite, vous pouvez utiliser des commandes shell dans votre image de base pour approfondir l’investigation (par ex. `top` sur ubuntu).

### Personnaliser l’image du serveur

Nous prenons également en charge l’ajout de votre propre Dockerfile pour les utilisateurs qui ont besoin de plus de contrôle sur leurs images en raison de l’optimisation de la taille du build, de dépendances superflues ou d’un processus de démarrage plus complexe. Vous pouvez éventuellement fournir un chemin vers votre Dockerfile personnalisé à l’étape [#id-3.-containerize-your-game-server](#id-3.-containerize-your-game-server "mention"). Nous allons maintenant partager quelques conseils et bonnes pratiques « faites-le vous-même ».

**Vous rencontrez des problèmes avec les WebSockets ou les requêtes HTTPS ?**

* Si vous obtenez `Curl error 35: échec de la poignée de main du certificat. Erreur fatale. Code d’erreur UnityTls : 7` ne désespérez pas, il s’agit d’un problème connu avec les anciennes images de base (`FROM`) incluant un certificat d’autorité racine expiré. Vous pouvez corriger cela en mettant à jour vers une version plus récente de l’image de base (par ex. `ubuntu:22.04`), puis en exécutant `update-ca-certificates` , ajoutez ceci à votre Dockerfile :

  ```docker
  FROM ubuntu:22.04

  RUN apt-get install -y ca-certificates && \
      apt-get clean && \
      update-ca-certificates
  ```

{% hint style="info" %}
Vous vous heurtez à un mur ? Nous sommes disponibles sur notre [Discord communautaire](https://discord.gg/MmJf8fWjnt) et ravis de vous aider.
{% 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/docs.edgegap.com-fr/unity.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.
