Comment ajouter un système de matchmaking à un jeu de tir à la première personne multijoueur (FPS)

Principales informations

Principales informations

Principales informations

Le matchmaker d'Edgegap est un système de matchmaking entièrement géré et infiniment personnalisable qui regroupe de manière optimale les joueurs du monde entier – et son utilisation est gratuite pendant le développement de votre jeu multijoueur de tir à la première personne.

C'est également le seul système de matchmaking (à notre connaissance) avec des règles de matchmaking basées sur la latence pour offrir l'expérience multijoueur en ligne idéale pour votre jeu, quel que soit le moteur (Unity, Unreal, etc.) ou les services de jeu (EOS, UGS, PlayFab, Heroic Labs Nakama, Braincloud, etc.).

Comme notre matchmaker est basé sur des paramètres, il n'est pas nécessaire d'écrire du code. L'intégration est donc très simple et si nécessaire, nos guides d'intégration vous accompagnent à chaque étape.

Lorsque votre jeu est en ligne, étant donné que notre système de matchmaking est entièrement géré, vous n'avez pas besoin de gérer l'infrastructure, les bogues, les pannes, la montée en charge ou la gestion de la base de données. Nous nous occupons de tout pour vous. Réduisant ainsi votre charge de travail DevOps à presque zéro.

Comment intégrer le matchmaking dans votre jeu de tir à la première personne multijoueur (FPS)

-> Cet article est basé sur la documentation de matchmaking. Si vous rencontrez des problèmes ou des incohérences, veuillez vous assurer de vous référer au guide original, car il est plus régulièrement mis à jour.

L'exemple suivant vous aidera à tester le flux principal de matchmaking pour les joueurs, à savoir :

Il y a cinq étapes pour intégrer notre système de matchmaking dans votre jeu :

  1. La première étape consiste à créer un compte et à utiliser notre exemple de jeu FPS. Voilà, vous êtes (techniquement) presque à moitié fait ! Vous n'avez qu'à intégrer le système de matchmaking dans votre jeu (voir l'étape 5).

  2. Maintenant, vous ne devriez jamais suivre aveuglément un exemple de JSON trouvé sur Internet, il est donc fortement recommandé d'adapter les règles ci-dessus à votre jeu. L'étape 2 (“Explorer la configuration”) est notre “comment lire” qui explique la fonction de chaque fonction de règlement de matchmaking (“Explorer la configuration”).

  3. L'étape 3 (“Examiner les détails de l'instance”) couvre votre matchmaker personnel et spécifique afin de s'assurer qu'il soit déployé et fonctionne avec la conception de votre jeu.

  4. L'étape 4, comme son nom l'indique (“4. Tester l'API des tickets”), concerne le test des demandes de matchmaking des joueurs reçues par le matchmaker, appelées tickets.

  5. L'étape 5 (“Intégrer le matchmaking dans votre jeu”) met en évidence comment intégrer le matchmaker dans le projet de votre moteur.

Si vous avez des défis de dépannage, notre Centre d'apprentissage en profondeur propose des astuces supplémentaires de dépannage.

1. Configurer le niveau gratuit

Inscrivez-vous pour obtenir votre compte Edgegap gratuit, et naviguez vers la page du tableau de bord du matchmaker.

À partir de là, cliquez d'abord sur Créer un matchmaker , puis saisissez :

  • Un nom pour votre matchmaker – qui est purement pour votre propre référence, par exemple quickstart-dev,

  • Ensuite, téléchargez l'exemple simple suivant comme configuration JSON pour votre jeu FPS :

{
  "version": "1.0.0",
  "max_deployment_retry_count": 3,
  "ticket_expiration_period": "5m",
  "ticket_removal_period": "1m",
  "profiles": {
    "casual-example": {
      "application": {
        "name": "my-game-server=>CHANGE-THIS-NAME-HERE",
        "version": "2024.01.30-16.23.00-UTC=>CHANGE-THIS-HERE "
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 1
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "10": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "30": {
            "beacons": {
              "difference": 50
            }
          },
          "60": {
            "league_rank": {
              "max_difference": 2
            }
          },
          "180": {
            "beacons": {
              "difference": 100,
              "max_latency": 500
            }
          }
        }
      }
    },
    "competitive-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "60": {
            "beacons": {
              "difference": 50
            }
          },
          "180": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    },
    "challenger-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "180": {
            "beacons": {
              "difference": 50
            }
          },
          "240": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    }
  }
}

(rappel amical pour vous assurer de changer le nom de l'application version pour correspondre à votre application et versions!)

S'il n'y a pas d'erreurs de validation, cliquez sur Créer et démarrer et attendez que le processus soit terminé. Cela entraînera le démarrage d'un nouveau cluster gratuit, avec votre exemple simple de matchmaker.

Vous pouvez maintenant passer à l'étape suivante.

2. Explorer la configuration

Règles uniques pour les jeux FPS

Spécifiquement pour les jeux FPS, vous pouvez définir plusieurs profils de matchmaking pour les règles et paramètres spécifiques aux modes de jeu :

  • restreindre le rang dans une différence entre deux joueurs pour des jeux plus décontractés,

  • restreindre la différence de rang pour permettre uniquement aux adversaires d'avoir le même rang pour les jeux classés,

  • permettre aux joueurs de fournir leurs préférences de carte et choisir une carte adaptée à tous,

  • ajouter une interface de sélection de hub pour restreindre les adversaires à des balises de ping spécifiées,

  • restreindre la latence de matchmaking à un seuil maximum pour empêcher le rapprochement de joueurs éloignés,

  • restreindre la latence de matchmaking à une différence maximum pour maximiser l'équité des pings,

  • allouer plus de CPU ou de mémoire en utilisant différentes versions d'application lorsque plus de joueurs sont autorisés,

  • Rejoindre en groupe pour des lobbies préfabriqués ou pour remplir des équipes sans dépasser les tailles d'équipe.

Commencez avec les conditions idéales, et développez les restrictions pour garantir des matchs rapides :

  • détendez lentement les restrictions de latence au fil du temps pour trouver plus de joueurs,

  • augmentez lentement la différence de rang autorisée pour trouver plus de joueurs,

  • augmentez le temps entre les expansions pour les plus hauts rangs (challengers), car moins de joueurs sont disponibles.

Créez des tickets avec un rang plus élevé pour les matchs de promotion, afin de correspondre à des adversaires plus difficiles.

Définissez des profils de tricheurs séparés pour vous assurer que les tricheurs signalés ou les joueurs ayant un grand nombre de rapports de modération n'impactent pas négativement l'expérience des joueurs légitimes dans les matchs classés.

Gestion sémantique des versions

Chaque nouvelle version utilise la gestion sémantique des versions pour communiquer clairement l'impact des changements en interprétant le format major.minor.patch :

  • major les versions incluent des changements majeurs et nécessitent une révision d'intégration,

  • minor les versions incluent des améliorations substantielles compatibles avec les versions précédentes,

  • patch les versions incluent des corrections de bogues et des améliorations mineures.

Certaines mises en production peuvent entraîner des erreurs. Nous tentons de résoudre cela en réessayant le déploiement jusqu'à max_deployment_retry_count fois automatiquement (sans confirmation du client).

Pour garantir que les plantages inattendus des clients ou les tickets abandonnés ne restent pas et n'occupent pas vos ressources de matchmaking, les tickets seront annulés après ticket_expiration_period passant leur statut à CANCELLED et seront ensuite définitivement supprimés après ticket_removal_period.

Le cœur de notre logique de matchmaking est configuré dans les profils de matchmaking. Chaque profil est une file d'attente de matchmaking totalement isolée, pointant vers des versions d'application avec une quantité prédéfinie de ressources CPU et mémoire (RAM) requises.

Les règles de matchmaking dans l'ensemble de règles initiales doivent être respectées pour regrouper les joueurs, chacune étant définie par trois propriétés :

  • nom de votre choix, par exemple - taille du match,

  • type de règle, également connu sous le nom d'opérateur, par exemple - player_count,

  • et enfin les attributs de l'opérateur, par exemple team_count ou team_size.

Règle du nombre de joueurs

C'est une règle spéciale définissant combien de joueurs doivent s'associer pour initier l'attribution :

  • team_count fait référence au nombre d'équipes, 1 équipe peut être utilisée pour des modes coopératifs ou de tous contre tous,

  • team_size fait référence au nombre de joueurs par équipe.

Notre exemple simple démontre un jeu coopératif avec 2 joueurs.

Veuillez noter que la règle "Nombre de joueurs" est requise et ne peut être définie qu'une seule fois dans vos règles de configuration initiales.

Règle des latences

Utilisez cette règle pour fournir le ping le plus bas possible à tous les joueurs. Une fois que les clients mesurent et soumettent leur temps de trajet aller-retour (ping) contre toutes les balises disponibles, Gen2 ne considérera les matchs qu'à l'intérieur d'une différence spécifique dans les valeurs de ping, mesurées contre les balises de ping. Cela présente une solution « douce » pour diviser votre base de joueurs, permettant un matchmaking avec des régions voisines, améliorant ainsi la vitesse des matchs pour les régions moins peuplées. Utilisez max_latency pour empêcher le rapprochement avec des joueurs situés loin.

Vous pouvez maintenant passer à l'étape suivante.

Notre exemple de balises ci-dessus avec "difference": 50, "max_latency": 200 initialement :

  • Alice et Bob seront associées, car Pékin est écarté (>200) et le reste est dans | A-B | < 50 :

    • Alice {Montréal: 12.3, Newark: 45.6, Dallas: 59.9, Pékin: 264.4}; et

    • Bob {Montréal: 27.3, Newark: 32.4, Dallas: 23.1, Pékin: 252.2}.

  • Charlie et Dave ne seront pas associés, car | C-D | > 50 pour la balise de Dallas :

    • Alice {Montréal: 5.7, Newark: 44.2, Dallas: 59.5, Pékin: 263.2}; et

    • Bob {Montréal: 57.8, Newark: 32.0, Dallas: 24.2, Pékin: 272.3}.

Veuillez noter que les "Règles de latences" ne peuvent être définies qu'une seule fois dans vos règles de configuration initiales.

3. Examiner les détails de l'instance

Examinez les détails de votre nouveau matchmaker dans notre tableau de bord une fois qu'il est initialisé :

État indique la santé du service, peut être EN LIGNE, HORS LIGNE ou ERREUR.

  • Identifiant aide le personnel d'Edgegap à trouver rapidement votre matchmaker si vous avez besoin d'aide pour le dépannage.

  • Commencé à peut être utile pour suivre l'heure de la dernière mise à jour.

  • Taille correspond à l'un de nos niveaux de prix.

  • URL de l'API sera utilisée par les clients de jeux et les serveurs de jeux pour communiquer avec Gen2.

  • URL Swagger est une interface GUI de spécification openAPI pratique que nous proposons pour explorer le schéma de l'API.

  • Jeton d'autorisation est un jeton secret unique utilisé par les clients de jeux et le serveur de jeux pour l'authentification.

Pour tester votre nouveau matchmaker à l'aide de l'API, vous aurez besoin de l'URL Swagger, de l'URL de l'API et du jeton d'autorisation.

Vous pouvez maintenant passer à l'étape suivante.

4. Tester l'API des tickets

Tout d'abord, ouvrez votre URL Swagger pour inspecter votre schéma openAPI dans l'interface Swagger

Cliquez sur le /...swagger.json URL sous le titre “Matchmaker” pour ouvrir le schéma JSON brut :

Enregistrez cette page sous forme de fichier sur votre disque (CTRL/CMD+S).

Ouvrez votre application Postman et connectez-vous à votre compte gratuit.

Importez votre fichier swagger.json de l'étape précédente :

  • gardez la collection Postman sélectionnée,

  • séléctionnez Afficher les paramètres d'importation et changez le paramètre génération de paramètres en Exemple.

Confirmez l'importation, cela entraînera l'apparition d'une nouvelle collection dans la liste des collections à gauche, intitulée Matchmaker.

Afficher plus d'actions, ouvrez l'onglet Autorisation et choisissez :

  • Type d'auth - Clé API,

  • Clé - “Autorisation

  • Valeur - insérez votre valeur AuthToken ici,

  • Ajoutez à - En-tête.

Pressez (CTRL/CMD+S) ou l'icône d'enregistrement pour enregistrer les modifications. Le point orange dans votre onglet Postman devrait disparaître.

Dans votre collection Matchmaker, sélectionnez tickets et Créer un ticket de matchmaking, ouvrant un nouvel onglet.

Sélectionnez l'onglet Corps pour prévisualiser votre demande de ticket de joueur :

remarquez que player_ip est défini sur null- cela le fera utiliser l'adresse IP ajoutée automatiquement à votre demande (voir Intégration Serveur à Serveur pour des alternatives),

  • profil fait référence à vos profils de matchmaking,

  • attributs incluent des valeurs pour vos règles de matchmaking, dans ce cas pour la règle des latences,

    • la règle player_count est la seule règle qui ne nécessite pas d'attributs dans les tickets des joueurs.

REMARQUE: Assurez-vous de vous référer à la configuration d'importation Swagger de l'exemple. 

Cliquez sur Envoyer et examinez la réponse à votre demande de ticket de joueur :

  • id est l'identifiant unique de votre ticket de matchmaking, conservez-le pour vérifier votre ticket plus tard,

  • profil confirmant le choix des profils de matchmaking,

  • group_id est un identifiant de groupe unique attribué à chaque ticket, un joueur solo est représenté comme un groupe de 1,

  • player_ip est l'adresse IP publique résolue du joueur, quel que soit le méthode d'identification utilisée,

  • assignment est défini sur null pour indiquer que le ticket n'a pas encore été associé ou attribué à un serveur,

  • created_at fournit des informations sur le moment où le ticket de joueur a été créé pour l'utilisation dans l'interface utilisateur du jeu,

  • status indique l'état actuel du ticket, tous les tickets commencent en SEARCHING (voir processus de matchmaking pour plus de détails).

Créez un deuxième ticket en cliquant Envoyer à nouveau, afin que nos deux joueurs s'associent et qu'un serveur soit démarré.

Dans votre collection Matchmaker, sélectionnez {ticketId} et Lire un ticket de matchmaking.

Entrez l'ID du ticket de la réponse à l'étape précédente et cliquez sur Envoyer.

Examinez l'attribution mise à jour pour votre ticket de joueur :

  • l'état est passé à MATCH_FOUND en premier, tout en gardant assignment défini sur null pour indiquer que les joueurs ont été associés et qu'un serveur est en cours d'attribution,

Cliquez sur Envoyer à nouveau pour vérifier votre ticket, et examinez l'attribution mise à jour pour votre ticket de joueur :

  • l'état est passé à HOST_ASSIGNED avec assignment contenant les détails du serveur attribué.

 Inspectez votre nouveau déploiement dans notre tableau de bord :

  • notez que chaque déploiement est étiqueté avec tous les IDs de tickets et profils pour une meilleure traçabilité.

Essayez de vous connecter depuis votre client de jeu au serveur attribué.

Une fois que vous vérifiez que vous pouvez vous connecter à votre déploiement sans problème et que vous avez terminé les tests, Arrêtez votre déploiement pour libérer de la capacité dans votre compte pour le prochain build.

Vous pouvez maintenant passer à l'étape suivante.

5. Intégrer le matchmaker dans votre jeu

Le système de matchmaking d'Edgegap s'intègre :

  • avec le client de jeu, pour gérer les tickets de joueur,

  • avec le serveur de jeu, pour :

    • traiter les préférences des joueurs transmises par leurs tickets,

    • facultativement pour supporter le remplissage pour ajouter ou remplacer des joueurs après le démarrage.

Pour le client de jeu, nous recommandons de fournir des mises à jour de l'état des tickets tout au long du processus de matchmaking aux joueurs à l'aide de l'interface utilisateur en jeu pour la meilleure expérience de joueur. Voir :

Dans le client de jeu, assurez-vous de gérer les erreurs non récupérables :

  • HTTP 404 Non trouvé - le ticket a été supprimé,

  • HTTP 500 Erreur interne du serveur - panne temporaire du service.

Dans le serveur de jeu, traitez les préférences des joueurs et le contexte initial du serveur. Aucune intégration API n'est nécessaire :

  1. Lire les variables d'environnement injectées (Gen2) pour récupérer les données de matchmaking initiales des joueurs.

  2. Lisez les variables d'environnement injectées (versions d'application) pour les paramètres spécifiques à la version, les paramètres (capacité des joueurs) et les secrets.

  3. Lisez les variables d'environnement injectées (déploiement) pour les informations de déploiement, telles que l'adresse IP, l'emplacement, ou plus.

Une fois que les joueurs sont connectés, le serveur de jeu et les clients de jeu démarrent une scène de chargement pour effectuer des étapes de synchronisation (par exemple, sélectionner et charger une carte/scène/niveau). Nous recommandons une scène 3D complète, une interface utilisateur sociale de type lobby, ou un écran de chargement avec une barre de progression, pour indiquer que l'initialisation progresse.

Une fois que les clients de jeu sont entièrement chargés, les joueurs chargent/voyagent vers la scène principale de gameplay.

Facultativement, le serveur de jeu peut créer et gérer le remplissage et la capacité des joueurs (ajouter ou remplacer les joueurs qui partent).

Assurez-vous que votre déploiement sera arrêté correctement en utilisant DELETE_URL injecté, si :

  • aucun joueur ne rejoins le match,

  • tous les joueurs ont quitté le match,

  • le match se termine correctement.

Félicitations, vous avez terminé l'intégration de Edgegap Matchmaker ! Si vous souhaitez en savoir plus, lisez tout à ce sujet dans notre Centre d'apprentissage.