Comment ajouter un matchmaking à un jeu de combat 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 multijoueur de combat.

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, 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, comme 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 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 combat multijoueur

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

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

Il y a cinq étapes pour implémenter notre matchmaker dans votre jeu :

  1. La première étape consiste à créer un compte et à utiliser notre exemple de jeu de combat. Voilà, vous êtes (techniquement) à mi-chemin ! Il ne vous reste plus qu'à intégrer le matchmaker dans votre jeu (voir é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 (« Explore Configuration ») est notre « comment lire » qui explique la fonction de chaque fonction de matchmaking rules (“Explore Configuration”).

  3. L'étape 3 (« Review Instance Details ») couvre votre matchmaker personnel et spécifique afin de s'assurer qu'il est déployé et fonctionne avec le design de votre jeu.

  4. L'étape 4, comme son nom l'indique (« 4. Test Ticket API »), concerne le test de vos demandes de matchmaking reçues des joueurs, 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 rencontrez des difficultés de dépannage, notre Centre d'apprentissage approfondi contient des conseils supplémentaires en matière de dépannage.

1. Configuration du Free Tier

Inscrivez-vous pour votre compte Edgegap gratuit et accédez à la page de tableau de bord Matchmaker.

À partir de là, cliquez sur Créer un Matchmaker en premier, puis saisissez :

  • Un nom pour votre matchmaker - qui est purement à titre de référence, par exemple quickstart-dev,

  • Puis, téléchargez l'exemple simple suivant comme configuration JSON ci-dessous pour votre jeu de combat :

{
  "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 s'assurer de modifier le nom de l'application et version pour correspondre à votre Application et Versions !) (gentil rappel de bien vouloir modifier le nom de l'application et version pour correspondre à votre Application et Versions !)

Si aucune erreur de validation n'apparaît, cliquez sur Create and Start et attendez que le processus se termine. Cela entraînera le démarrage d'un nouveau cluster gratuit avec votre matchmaker Exemple Simple.

Vous pouvez maintenant passer à l'étape suivante.

2. Explorer la Configuration

Règles uniques pour le jeu de combat

Spécifiquement pour les jeux de combat, 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 des jeux plus occasionnels,

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

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

  • ajouter l'UI de Sélection de Hub pour restreindre les adversaires aux Balises de Ping spécifiées,

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

  • restreindre la latence de 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'App lorsque plus de joueurs sont autorisés,

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

Commencez avec les conditions idéales et élargissez les restrictions pour assurer 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 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 se mesurer à des adversaires plus difficiles.

Définir des profils de tricheurs séparés pour garantir 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.

Versionnement sémantique

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

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

  • les versions minor incluent des améliorations substantielles compatibles avec les versions antérieures,

  • 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 client).

Pour garantir que des crashs inattendus du client ou des tickets abandonnés ne restent pas et ne consomment pas vos ressources de matchmaker, les tickets seront annulés après ticket_expiration_period provoquant leur statut à changer en ANNULÉ et ensuite 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'App 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 que les joueurs soient regroupés, chacune 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 de Nombre de Joueurs

C'est une règle spéciale définissant combien de joueurs doivent correspondre 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 chacun pour soi,

  • 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 fois dans votre ensemble de règles de configuration initiale.

Règles de 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 aller-retour (ping) contre toutes les balises disponibles, Gen2 ne prendra en compte que les correspondances dans 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 de se rapprocher des régions voisines, améliorant surtout la vitesse de match pour les régions moins peuplées. Utilisez max_latency pour empêcher le matching contre des joueurs situés trop loin.

Vous pouvez maintenant passer à l'étape suivante.

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

  • Alice et Bob se matcheront, puisque Beijing est rejeté (>200) et le reste est en deçà de | A-B | < 50 :

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

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

  • Charlie et Dave ne se matcheront pas, puisque | C-D | > 50 pour la Balise de Dallas :

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

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

Veuillez noter que les "Règles de Latences" ne peuvent être définies qu'une fois dans votre ensemble de règles de configuration initiale.

3. Examiner les Détails de l'Instance

Examinez les détails de votre nouveau matchmaker sur 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 à retrouver rapidement votre matchmaker si vous avez besoin d'aide pour le dépannage.

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

  • Taille correspond à l'un de nos Paliers de Prix.

  • L'URL de API sera utilisée par les Clients de Jeu et les Serveurs de Jeu pour communiquer avec Gen2.

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

  • Le 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 de l'URL de Swagger, de l'URL API et du jeton d'authentification.

Vous pouvez maintenant passer à l'étape suivante.

4. Tester l'API de Tickets

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

cliquez sur l'URL /...swagger.json 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 de l'étape précédente :

  • gardez Collection Postman sélectionnée,

  • sous Voir les Paramètres d'Importation et modifiez le paramètre Génération des param en Exemple.

Confirmez l'importation, cela aboutira à une nouvelle collection apparaissant dans la liste des Collections à gauche, titrée Matchmaker.

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

  • Type d'authentification - Clé API,

  • Clé - « Autorisation »

  • Valeur - insérer votre valeur AuthToken ici,

  • Ajouter à - Entête.

Appuyez (CTRL/CMD+S) ou sur 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 joueur :

remarquez player_ip défini sur nul - cela entraînera l'utilisation de l'adresse IP automatiquement ajoutée à votre demande (voir Intégration de serveur à serveur pour des alternatives),

  • profil fait référence à vos Profils de Matchmaking,

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

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

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

Cliquez sur Envoyer et passez en revue la réponse à votre demande de ticket joueur :

  • id est votre identifiant de ticket de matchmaking unique, gardez-le sauvegardé pour vérifier votre ticket plus tard,

  • profil confirmant le choix de Profils de Matchmaking,

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

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

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

  • created_at fournit des informations sur la création du ticket joueur pour l'utilisation de l'interface utilisateur de jeu,

  • status indique le stat नवघा tickets SEARCHING (voir Processus de Matchmaking pour plus de détails).

Créez un deuxième ticket en appuyant à nouveau sur Envoyer, afin que nos deux joueurs se correspondent et qu'un serveur soit démarré.

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

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

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

  • status changes to MATCH_FOUND first, while keeping assignment set to null to indicate players have matched and are being assigned to a server,

Press Send again to check on your ticket, and review the updated assignment for your player ticket:

  • the status changed to HOST_ASSIGNED with assignment containing details of the assigned server.

 Inspect your new deployment in our dashboard :

  • notice that each deployment is tagged with all ticket IDs and profiles for added traceability.

Try connecting from your game client to the assigned server.

Once you have verified that you are able to connect to your Deployment without issue and have completed testing, Stop your Deployment to free up capacity in your account for the next build.

Vous pouvez maintenant passer à l'étape suivante.

5. Intégrez le Matchmaker dans votre Jeu

L'intégration du matchmaking d'Edgegap :

  • avec le Client de Jeu, pour gérer les Tickets de Joueurs,

  • avec le Serveur de Jeu, pour :

    • traiter les préférences de joueurs transmises par leur tickets,

    • accéder optionnellement au Backfill pour ajouter ou remplacer des joueurs après leur début.

Pour le Client de Jeu, nous recommandons de fournir des mises à jour d'état de ticket tout au long du Processus de Matchmaking aux joueurs en utilisant l'interface utilisateur du jeu pour la meilleure expérience des joueurs. Voir :

Dans le Client de Jeu, assurez-vous de traiter les erreurs non répétables :

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

  • HTTP 500 Internal Server Error - panne de service temporaire.

Dans le Serveur de Jeu, traiter les préférences de 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 initiales de matchmaking des joueurs.


Une fois que les joueurs se connectent, le Serveur de Jeu et les Clients de Jeu commencent une scène de chargement pour effectuer des étapes de synchronisation (par exemple, sélection et chargement d'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 qu'il est en cours d'initialisation.

Une fois complètement chargés, les Clients de Jeu chargent/voyagent vers la scène principale de gameplay.

Optionnellement, le Serveur de Jeu peut créer et gérer le Backfill et la capacité des joueurs (ajouter ou remplacer les joueurs qui quittent).

Assurez-vous que votre déploiement sera arrêté correctement en utilisant le 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 terminé l'intégration d'Edgegap Matchmaker! 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