Comment ajouter un système de matchmaking à un jeu multijoueur en arène libre

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 gratuit pour tous.

C'est également le seul système de matchmaking (à notre connaissance) avec des règles de matchmaking basées sur la latence pour fournir 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 facile 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 bugs, les pannes, la scalabilité ou la gestion de 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 multijoueur en free-for-all

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

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

Il y a cinq étapes pour intégrer notre matchmaker dans votre jeu :

  1. La première étape consiste à créer un compte et à utiliser notre exemple de jeu de stratégie. Voilà, vous êtes (techniquement) à mi-chemin ! Vous devrez simplement intégrer le matchmaker dans votre jeu (voir é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 en free-for-all. L'étape 2 (“Explorer la configuration”) est notre “comment lire” qui explique la fonction de chaque règle de matchmaking (“Explorer la configuration”).

  3. L'étape 3 (“Revoir les détails de l'instance”) couvre votre matchmaker personnel et spécifique afin de garantir qu'il soit déployé et fonctionne avec le design de votre jeu.

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

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

Si vous avez des défis de dépannage, notre Centre d'apprentissage détaillé propose des conseils supplémentaires pour le 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 et saisissez :

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

  • Ensuite, téléchargez l'exemple simple suivant en tant que configuration JSON ci-dessous pour votre jeu en free-for-all :

{
  "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 de vous assurer de changer le nom de l'application version pour correspondre à votre application et versions!)

Si aucune erreur de validation n'apparaît, cliquez sur Créer et démarrer et attendez que le processus soit complet. Cela entraînera le lancement d'un nouveau cluster gratuit, avec votre matchmaker d'exemple simple.

Vous pouvez maintenant passer à l'étape suivante.

2. Explorer la configuration

Règles uniques pour les jeux en free-for-all

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

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

  • restreindre la différence de classement pour ne permettre que des adversaires ayant le même classement pour les jeux classés,

  • laisser les joueurs fournir leurs préférences de carte et choisir une carte appropriée pour tout le monde,

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

  • restreindre la latence du matchmaking à un seuil maximum pour éviter de regrouper des joueurs éloignés,

  • restreindre la latence du matchmaking à une différence maximale pour maximiser l'équité du ping,

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

  • Rejoindre en groupe pour des lobbys préfabriqués ou pour remplir des équipes sans dépasser la taille des équipes.

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

  • relâchez lentement les restrictions de latence au fil du temps pour trouver plus de joueurs,

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

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

Créez des tickets avec un rang plus élevé pour les matchs de promotion, afin de faire 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 nombre élevé de rapports de modération n'impactent pas négativement l'expérience des joueurs légitimes dans les matchs classés.

Versioning sémantique

Chaque nouvelle version utilise le versioning sémantique pour communiquer clairement l'impact des changements en interprétant le format majeur.mineur.patch :

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

  • les versions mineur incluent des améliorations substantielles rétrocompatibles,

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

Certaines déploiements 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 éviter que des problèmes inattendus de client ou des tickets abandonnés ne persistent et n'occupent vos ressources de matchmaker, les tickets seront annulés après ticket_expiration_period ce qui modifiera leur statut à ANNULÉ 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 les versions d'application avec un montant prédéfini de ressources CPU et mémoire (RAM) requises.

Les règles de matchmaking dans le jeu de règles initial doivent être respectées pour que les joueurs soient regroupés, chaque règle é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 - nombre_de_joueurs,

  • et enfin les attributs de l'opérateur, par exemple nombre_d'équipes ou taille_d'équipe.

Règle du nombre de joueurs

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

  • nombre_d'équipes fait référence au nombre d'équipes, 1 équipe peut être utilisée pour des modes coopératifs ou en free-for-all,

  • taille_d'équipe 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 initiale.

Règle des latences

Utilisez cette règle pour fournir le ping le plus bas possible pour tous les joueurs. Une fois que les clients mesurent et soumettent leur temps de réponse aller-retour (ping) avec toutes les balises disponibles, Gen2 ne considérera que les matchs dans une différence spécifique des valeurs de ping, mesurées par rapport aux balises de ping. Cela représente une solution “douce” pour diviser votre base de joueurs, permettant de faire correspondre des régions voisines, en améliorant particulièrement la rapidité des matchs pour des régions moins peuplées. Utilisez max_latencypour empêcher d'associer des joueurs situés loin.

Vous pouvez maintenant passer à l'étape suivante.

Notre exemple de règle balises ci-dessus avec "différence": 50, "max_latency": 200 au départ :

  • Alice et Bob seront appariés, puisque 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 appariés, puisque | 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 latence" peuvent uniquement être définies une fois dans vos règles de configuration initiale.

3. Revoir 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 retrouver le dernier temps de mise à jour.

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

  • API URL sera utilisé par les clients de jeu et les serveurs de jeu pour communiquer avec Gen2.

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

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

Pour tester votre nouveau matchmaker en utilisant l'API, vous aurez besoin du Swagger URL, de l'API URL et du Jeton d'authentification.

Vous pouvez maintenant passer à l'étape suivante.

4. Tester l'API des Tickets

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

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

Enregistrez cette page en tant que fichier sur votre disque (CTRL/CMD+S).

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

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

  • gardez Postman Collection sélectionné,

  • séléctionez 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,

  • Ajouter à - En-tête.

Appuyez sur (CTRL/CMD+S) ou sur l'icône de sauvegarde pour sauvegarder les modifications. Le point orange dans l'onglet Postman devrait disparaître.

Dans votre collection de matchmaker, sélectionnez tickets et créez 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 provoquera l'utilisation de l'adresse IP automatiquement ajoutée à votre demande (voir Intégration serveur à serveur pour des alternatives),

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

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

    • la règle nombre_de_joueurs est la seule règle qui ne nécessite aucun attribut dans les tickets des joueurs.

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

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

  • id est votre ID unique de ticket de matchmaking, gardez cela enregistré 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 solitaire est représenté comme un groupe de 1,

  • player_ip est l'adresse IP publique résolue du joueur, peu importe la méthode d'identification utilisée,

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

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

  • status indique le statut actuel du ticket, tous les tickets commencent en RECHERCHER (voir Processus de matchmaking pour plus de détails).

Créez un second ticket en cliquant sur Envoyer à nouveau, afin que nos deux joueurs soient appariés et qu'un serveur soit démarré.

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

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

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

  • le statut est passé à MATCH_FOUND en premier, tout en conservant assignment défini sur null pour indiquer que les joueurs ont été appariés et qu'un serveur est en cours d'attribution,

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

  • le statut est passé à HOST_ASSIGNED avec assignment contenant les détails du serveur attribué.

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

  • remarquez que chaque déploiement est marqué avec tous les IDs de ticket et le profil pour une traçabilité supplémentaire.

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

Une fois que vous avez vérifié que vous pouvez vous connecter à votre déploiement sans problèmes 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 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,

    • optionnellement soutenir le retour à des emplacements pour ajouter ou remplacer des joueurs après le démarrage.

Dans le client de jeu, nous recommandons de fournir des mises à jour de l'état des tickets pendant tout le processus de matchmaking aux joueurs en utilisant l'interface utilisateur en jeu pour la meilleure expérience possible. Voir :

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

  • HTTP 404 Introuvable - 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 requise :

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

  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 des informations sur le déploiement, telles que l'adresse IP, l'emplacement, ou plus.

Une fois que les joueurs se connectent, le serveur de jeu et les clients de jeu démarrent une scène de chargement pour effectuer les étapes de synchronisation (par exemple, sélectionnant et chargeant 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 ont complètement chargé, les joueurs chargent/traversent vers la scène de gameplay principale.

Optionnellement, le serveur de jeu peut créer et gérer des retours à des emplacements et la capacité des joueurs (ajouter ou remplacer des joueurs qui partent).

Assurez-vous que votre déploiement sera arrêté correctement en utilisant l'URL de suppression injectée, si :

  • aucun joueur ne rejoint le match,

  • tous les joueurs ont quitté le match,

  • le match conclut correctement.

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

Écrit par

l'équipe Edgegap