Comment ajouter un système de matchmaking à un jeu de stratégie multijoueur

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 de stratégie multijoueur.

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 facile et si nécessaire, nos guides d'intégration vous accompagnent à chaque étape.

Lorsque votre jeu est en ligne, notre système de matchmaking étant entièrement géré, vous n'avez pas besoin de vous occuper de l'infrastructure, des bugs, des pannes, de la scalabilité ou de la gestion des bases de données. Nous nous occupons de tout pour vous, réduisant ainsi votre charge de travail en DevOps à presque zéro.

Comment intégrer le matchmaking à votre jeu de stratégie multijoueur

-> Cet article est basé sur la documentation de Matchmaking. Si vous rencontrez des problèmes ou des divergences, assurez-vous de consulter le guide original, car ils sont plus fréquemment mis à jour.

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

Voici cinq étapes pour mettre en œuvre notre faiseur de matchs dans votre jeu :

  1. La première étape consiste à créer un compte et à utiliser notre exemple de jeu de stratégie. Voilà, vous avez (techniquement) fait la moitié du travail ! Vous n'auriez besoin que d'intégrer le faiseur de matchs dans votre jeu (voir l'étape 5).

  2. Maintenant, vous ne devriez jamais suivre aveuglément un exemple 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 aborde la fonction de chaque fonction des règles de matchmaking

  3. L'étape 3 (« Examiner les détails de l'instance ») couvre votre faiseur de matchs personnel et spécifique afin de s'assurer qu'il est 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 exclusivement les tests pour s'assurer que les demandes de matchmaking de vos joueurs sont reçues par le faiseur de matchs, appelées tickets.

  5. L'étape 5 (« Intégrer le Matchmaking dans votre Jeu ») met en lumière comment intégrer le faiseur de matchs dans le projet de votre moteur.

Si vous rencontrez des problèmes de dépannage, notre centre d'apprentissage en profondeur propose des conseils supplémentaires en matière de dépannage.

1. Configuration du niveau gratuit

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

À partir de là, cliquez d’abord sur Créer un faiseur de matchs puis entrez :

  • Un nom pour votre faiseur de matchs – qui est purement pour votre référence personnelle, par exemple quickstart-dev,

  • Puis, téléchargez l'exemple simple ci-dessous en tant que configuration JSON pour votre jeu de stratégie :

{
  "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
            }
          }
        }
      }
    }
  }
}

(petit rappel pour vous assurer de changer le nom de l'application et la version pour correspondre à vos applications et versions !)

Si aucune erreur de validation n'apparaît, appuyez sur Créer et Démarrer et attendez la fin du processus. Un nouveau cluster gratuit sera ainsi lancé, avec votre faiseur de matchs "Exemple Simple".

Vous pouvez maintenant passer à l'étape suivante.

2. Explorer la configuration

Règles uniques pour les jeux de stratégie

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

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

  • restreindre la différence de classement pour n'autoriser que les adversaires du même rang pour les jeux classés,

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

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

  • restreindre la latence du matchmaking à un seuil maximum pour éviter de faire correspondre des joueurs loin,

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

  • 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émédités ou pour remplir des équipes sans dépasser les tailles d'équipe.

Commencez par les conditions idéales et élargissez les restrictions pour assurer des correspondances rapides :

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

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

  • augmenter le temps entre les expansions pour les rangs les plus élevés (challengers), car il y a moins de joueurs disponibles.

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

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

Versionnage sémantique

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

  • les versions majeures incluent des changements radicaux et nécessitent une révision de l'intégration,

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

  • les versions correction incluent des correctifs et des améliorations mineures.

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

Pour s'assurer que les plantages imprévus des clients ou les tickets abandonnés ne subsistent et n'affectent pas vos ressources de faiseur de matchs, les tickets seront annulés après ticket_expiration_period changeant leur statut à ANNULÉ puis supprimés définitivement 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 complètement isolée, pointant vers les versions d'application avec une quantité prédéfinie de CPU et de ressources mémoire (RAM) requises.

Les règles de Matchmaking dans l'ensemble de règles initial doivent être respectées pour que les joueurs soient regroupés, chaque ensemble étant défini 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 - compte de joueurs,

  • et enfin d'attributs opératoires, e.g. nombre d'équipes ou taille d'équipe.

Règle de Compte de Joueurs

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

  • nombre d'équipes fait référence au nombre d'équipes, 1 équipe peut être utilisée pour les modes coopératif ou chacun pour soi,

  • 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 de "Compte de Joueurs" est requise et ne peut être définie qu'une seule fois dans votre configuration initiale des règles.

Règles de Latence

Utilisez cette règle pour offrir 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 prendra en compte que les correspondances dans une différence spécifique des valeurs de ping, mesurée contre les balises de ping. Cela présente une solution « souple » pour diviser votre base de joueurs, permettant de faire des correspondances avec les régions voisines, améliorant particulièrement la vitesse des correspondances pour les régions moins peuplées. Utilisez latence_maximale pour éviter les correspondances avec des joueurs situés loin.

Vous pouvez maintenant passer à l'étape suivante.

Notre exemple balises règle ci-dessus avec "différence": 50, "latence_maximale": 200 initialement :

  • Alice et Bob vont se correspondre, puisque Pékin est rejeté (>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 vont pas se correspondre, 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 Latence" ne peuvent être définies qu'une seule fois dans votre configuration initiale des règles.

3. Examiner les détails de l'instance

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

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

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

  • Démarré à peut être utile pour suivre la dernière mise à jour.

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

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

  • URL Swagger est une interface fichiers openAPI 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 les serveurs de jeu pour l'authentification.

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

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 l'URL /...swagger.json sous le titre "Faiseur de matchs" pour ouvrir le schéma JSON brut :

Sauvegardez 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 de l'étape précédente :

  • gardez 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 Faiseur de matchs.

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

  • Type d'authentification - Clé API,

  • Clé - "Autorisation"

  • Valeur - insérez ici votre valeur AuthToken,

  • Ajouter à - En-tête.

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

Dans votre collection du faiseur de matchs, 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 :

notez player_ip défini sur null - cela incitera à utiliser 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 incluent des valeurs pour vos règles de faiseur de matchs, dans ce cas pour la règle latences,

    • la règle compte joueur est la seule règle qui ne nécessite aucun attribut dans les tickets de joueur.

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

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

  • id est votre ID de ticket de matchmaking unique, gardez-le enregistré pour consulter votre ticket plus tard,

  • profil confirmant le choix des profils de Matchmaking,

  • group_id est un ID 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, peu importe la méthode d'identification utilisée,

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

  • 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 par RECHERCHE (voir processus de matchmaking pour les détails).

Créez un deuxième ticket en appuyant à nouveau sur Envoyer, ainsi nos deux joueurs s'associent et un serveur est démarré.

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

Saisissez l'ID de 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 a changé pour MATCH_FOUND d'abord, tout en gardant assignment défini sur null pour indiquer que les joueurs ont été assortis 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 a changé pour HÔTE_ATTRIBUÉ avec assignment contenant les détails du serveur attribué.

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

  • notez que chaque déploiement est étiqueté avec tous les ID de tickets et le profil pour une traçabilité accrue.

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

Une fois que vous vérifiez que vous êtes capable de vous connecter à votre déploiement sans problème et que vous avez terminé les tests, arrêtez votre déploiement pour libérer la capacité dans votre compte pour la prochaine version.

Vous pouvez maintenant passer à l'étape suivante.

5. Intégrer le Matchmaker dans votre Jeu

Le matchmaking d'Edgegap 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 l'intermédiaire de leurs tickets,

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

Pour le client de jeu, nous recommandons de fournir des mises à jour du statut des tickets tout au long du processus de matchmaking aux joueurs via une interface utilisateur de jeu pour une meilleure expérience des joueurs. Voir :

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

  • HTTP 404 Not Found - le ticket a été supprimé,

  • HTTP 500 Internal Server Error - 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 d'API n'est requise :

  1. Lisez 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'applications) pour les paramètres spécifiques aux versions, les paramètres (capacité des joueurs), et les secrets.

  3. Lisez les variables d'environnement injectées (déploiement) pour les 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é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 est en cours.

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

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

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

  • aucun joueur ne rejoint le match,

  • tous les joueurs ont quitté le match,

  • le match se termine 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

Intégrer Edgegap facilement en quelques minutes

Intégrer Edgegap facilement en quelques minutes

Intégrer Edgegap facilement en quelques minutes