Mirror

Mirror sur Edgegap

Ce guide vous aidera à créer un serveur headless sur Edgegap pour un projet Unity en utilisant Mirrorarrow-up-right comme solution réseau.

Ce guide utilisera le projet d'exemple open-source Tanks, qui est déjà disponible dans votre exemple Mirror, emplacement Assets/Mirror/Examples/Tanks.

L'exemple final peut être trouvé sur notre GitHubarrow-up-right.

Construire le serveur de jeu

Une fois votre jeu prêt, rendez-vous sur l'onglet Build de l'éditeur Unity, sous File -> Build Settings dans les menus supérieurs. Assurez-vous de sélectionner les bons paramètres selon votre version d'Unity.

  • Avant la version 2021.2 :

    • Définir Target Platform sur Linux;

    • Définir Architecture sur x86_64;

    • Cochez l'option Server Build .

  • Sinon :

    • Définir Platform sur Dedicated Server;

    • Définir Target Platform sur Linux.

Ensuite appuyez sur build et sélectionnez un nouveau dossier vide nommé linux_server comme destination de fichier. Transférez linux_server le dossier dans un second dossier vide, qui sera appelé [SERVER BUILD] dans ce document.

Containerisation du serveur de jeu dédié

Nous allons créer une image docker contenant le serveur de jeu dédié dans cette partie. Vous pourriez également être intéressé par la lecture de Unity Server in Docker.

Si vous avez besoin de plus d'informations sur Docker avec Edgegap, veuillez vous référer à cette documentation.

Dockerfile

Notez le port que vous utilisez pour les communications réseau, appelé [GAME PORT]. Par défaut, le port utilisé est 7777. Vous pouvez trouver cette information dans l'éditeur Unity, sur le NetworkManager objet de jeu, dans le Transport composant.

  • Copiez les lignes ci-dessus et collez-les dans votre Dockerfile, placé à l'intérieur de [SERVER BUILD]. Modifiez les [GAME PORT] espaces réservés pour votre port de jeu.

Avoir le [GAME PORT] ouvert à la fois en TCP et UDP vous permet d'utiliser le transport que vous préférez dans le composant NetworkManager Mirror. Enfin, créez un fichier nommé boot.sh à la racine du [SERVER BUILD] dossier. Il sera exécuté lors du démarrage de l'image dans un conteneur.

  • Copiez les deux lignes suivantes, assurez-vous de remplacer les [YOUR GAME] espaces réservés par le nom du fichier généré.

À ce stade, vous devriez avoir la hiérarchie suivante :

  • Dossier [SERVER BUILD] > > - Dockerfile > > - boot.sh > > - linux_server dossier > > > - Fichiers générés par Unity

  • Ouvrez une invite de commande dans le [SERVER BUILD] dossier, et exécutez les commandes Docker suivantes :

circle-exclamation

Utilisation sous Linux

Utilisation de cmd

Utilisation de Powershell

Après ces commandes, vous devriez être en mesure de voir votre image téléchargée sur le site Edgegap si vous utilisez le registre de conteneurs Edgegap. Voir ce doc si vous souhaitez utiliser le registre Edgegap. Vous pouvez également utiliser un autre registre privé.

Déployer sur Edgegap

Naviguez vers la page Applications & Games du site web. Cliquez sur le bouton Create New en haut à droite pour accéder au formulaire d'application. Voici les champs et comment les remplir correctement :

  • Nom de l'application : Peut être n'importe quel nom distinctif que vous souhaitez utiliser pour reconnaître facilement votre application parmi d'autres.

  • Image : Peut être n'importe quelle image spécifique que vous souhaitez utiliser pour reconnaître facilement votre application parmi d'autres.

  • Nom de version : Vous pouvez utiliser un nom de version pour décrire la portée de la version que vous déployez. Des exemples peuvent être « demo », « production », « v1 », « v2 »

  • Conteneur :

    • Registry : « [URL] », où [URL] est la valeur des identifiants que vous pouvez afficher sur la page du Container Repository.

    • Image repository : « [PROJECT]/[YOUR GAME] », où [PROJECT] et [YOUR GAME] sont les valeurs que vous avez utilisées précédemment lors du push de l'image docker.

    • Tag : « [TAG] », où [TAG] est la valeur que vous avez utilisée précédemment lors du push de l'image docker.

    • Cochez « Using a private repository »

    • Nom d'utilisateur du registre privé : « [USERNAME] », où [USERNAME] est la valeur de vos identifiants.

    • Jeton du registre privé : « [TOKEN] », où [TOKEN] est la valeur de vos identifiants.

    • Requirements : Laisser tel quel.

    • Ports :

      • Cliquez sur le lien + Add port pour ajouter un nouveau port, et ajoutez les entrées suivantes :

        • [GAME PORT] - TCP/UDP - désactiver les Vérifications

        • 3389 - TCP - désactiver les Vérifications

Une fois votre application créée, vous pouvez appuyer sur le bouton Deploy pour procéder au déploiement de votre serveur de jeu. Choisissez la région où vous souhaitez déployer, et entrez le nombre de joueurs aléatoires que vous souhaitez générer selon votre jeu. Vérifiez que tout fonctionne correctement en vérifiant les éléments suivants :

  • Le statut le plus récent doit être défini sur Ready.

  • Dans l'onglet Port Mapping vous devriez voir le port que vous avez défini dans le formulaire de création de l'application :

Ajouter un HUD d'exemple dans votre application cliente

  • Définissez la valeur Port du composant Transport du NetworkManager sur le port externe défini dans l'onglet Port Mapping de votre déploiement.

Dans cet exemple, le port a été défini sur 31887. Cela dépend principalement du jeu que vous développez et sera très probablement défini de manière programmatique dans la base de code du jeu.

  • Définissez la valeur de Network Address du Network Manager sur l' Hostde votre déploiement. Cette URL peut être trouvée dans le Deployment Summary sur le tableau de bord ou via l'API.

Dans cet exemple, l'adresse a été définie sur 0ace560706a5.pr.edgegap.net. Encore une fois, cette valeur sera très probablement définie de manière programmatique lors de la communication du client avec le serveur maître/API responsable du processus de matchmaking.

Avec les bonnes informations, vous devriez pouvoir vous connecter normalement au serveur de jeu et commencer à jouer immédiatement.

Vous avez maintenant un projet Mirror prêt à être déployé à la demande !

Avec des déploiements basés sur les sièges, il est possible d'utiliser Mirror pour créer un système qui supprime automatiquement les sessions Edgegap orphelines une fois qu'un joueur se déconnecte du serveur, en utilisant NetworkManager fonctions de rappel, et un NetworkBehaviour script attaché au prefab du joueur qui utilise une fonction RPC (Remote Procedure Call) et une fonction Command.

Lorsque le serveur démarre, le NetworkManager récupère la liste des session IDs liés à son déploiement depuis l'API Edgegap et les stocke. Ensuite, lorsqu'un nouveau joueur se connecte au serveur, une fonction côté client est initiée via RPC qui enverra l' adresse IP du joueur au serveur via une command. Avec l'IP du joueur, le serveur vérifie s'il existe une IP correspondante dans les données de chaque session ; Le serveur obtient les données de session en utilisant son ID mis en cache via l'API Edgegap. Si une correspondance est trouvée, le session ID est mappé à la NetworkConnectionToClient.

du joueur. Comme de nouvelles sessions peuvent être ajoutées après le démarrage du serveur, la liste des session IDs est mise à jour et les nouvelles sessions sont vérifiées si une correspondance n'a pas pu être trouvée la première fois.

Enfin, une fois qu'un joueur se déconnecte du serveur, le serveur utilise l' NetworkConnectionToClient du joueur pour récupérer leur session IDassociée, puis utilise l'API Edgegap pour supprimer cette session. Cela libère une socket dans le déploiement pour qu'un nouveau joueur puisse rejoindre.

PlayerNetworkBehaviour

CustomNetworkManager

Fonctionnalités optionnelles

Ce script peut être étendu avec des fonctionnalités optionnelles et indépendantes qui aident à gérer les sessions dans des cas spécifiques.

Par exemple, un délai d'attente peut être défini pour supprimer sessions de sièges vides après un délai configurable suite à l'initialisation complète du serveur. C'est une fonctionnalité utile dans le cas d'un joueur qui abandonne avant que son ticket de matchmaking soit résolu, ce qui créerait une session vide une fois qu'un match est trouvé. Si le joueur n'envoie jamais son adresse IP pour être mappée à l'ID de session avant l'expiration du délai, alors cette session est supprimée pour libérer une socket.

Une autre fonctionnalité peut être de déconnecter les joueurs inactifs après une longue période afin de libérer des sockets. Une fois connecté au serveur, le client doit envoyer un message de heartbeat minimaliste au serveur toutes les quelques secondes, sinon il est déconnecté si trop de heartbeats sont manqués d'affilée. À la fois le temps entre les heartbeats et le nombre maximum de messages pouvant être manqués d'affilée peuvent être configurés, en fonction des besoins du jeu. Dans cet exemple, un heartbeat est envoyé toutes les quelques secondes si le tank se déplace sur la carte ou tire.

PlayerNetworkBehaviour - Gestion des sessions de sièges

CustomNetworkManager - Gestion des sessions de sièges

Mis à jour

Ce contenu vous a-t-il été utile ?