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 à votre jeu multijoueur en free-for-all

-> Cet article est basé sur la documentation Matchmaking. Si vous rencontrez des problèmes ou des différences, assurez-vous de 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 matchmaking de joueur, à 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 stratégie. Voilà, vous êtes (techniquement) à mi-chemin ! Vous n'auriez qu'à intégrer le matchmaker dans votre jeu (voir étape 5).

  2. Maintenant, vous ne devriez jamais suivre aveuglément un exemple JSON que vous avez trouvé sur internet, il est donc fortement recommandé d'adapter les règles ci-dessus à votre jeu free-for-all. L'étape 2 (« Explorer la Configuration ») est notre « comment lire » qui se penche sur la fonction de chaque fonction de règles matchmaking (« Explorer la Configuration »).

  3. L'étape 3 (« Examiner les détails de l'instance ») couvre votre matchmaker personnel et spécifique pour 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 »), est consacrée à tester que vos demandes de matchmaking de joueurs sont reçues par le matchmaker, appelées tickets.

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

Si vous rencontrez des difficultés de dépannage, notre centre d'apprentissage en profondeur propose des conseils supplémentaires pour le dépannage.

1. Configuration du niveau gratuit

Inscrivez-vous pour votre compte Edgegap gratuit et naviguez vers la page de tableau de bord Matchmaker.

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

  • 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 en tant que configuration JSON ci-dessous pour votre jeu 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 bien vouloir changer le nom et la version de l'application 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 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 de jeu uniques en Free-For-All

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

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

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

  • permettre aux joueurs d'indiquer 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 éviter d'associer 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 des versions d'application différentes lorsque plus de joueurs sont autorisés,

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

Commencez avec les conditions idéales, et élargissez les restrictions pour assurer 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 rang 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 des matchs de promotion, afin de s'associer avec des adversaires plus coriaces.

Définissez des profils de cheateurs séparés pour s'assurer que les cheaters signalés ou les joueurs avec de nombreux rapports de modération n'impactent 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 major.minor.patch :

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

  • les versions minor 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 essayons de résoudre cela en réessayant automatiquement le déploiement jusqu'à max_deployment_retry_count fois (sans confirmation client).

Pour s'assurer que les plantages inattendus des clients ou les tickets abandonnés ne persistent pas et n'utilisent pas les ressources de votre matchmaker, les tickets seront annulés après ticket_expiration_period provoquant leur statut de changer en ANNULÉ et ensuite définitivement supprimé 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 des versions d'application avec une quantité prédéfinie de CPU et de ressources mémoire (RAM) nécessaires.

Les règles de matchmaking dans l'ensemble de règles initial doit être respecté pour que les joueurs soient regroupés ensemble, chacune étant définie par trois propriétés :

  • nom de votre choix, par ex. - taille de match,

  • type de règle, également connu sous le nom d'opérateur, par ex. - comptage_joueurs,

  • et enfin les attributs d'opérateur, par ex. nombre_équipes ou taille_équipe.

Règle de nombre de joueurs

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

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

  • taille_é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 du nombre de joueurs » est requise et ne peut être définie qu'une seule fois dans vos règles de configuration initiales.

Règles de latence

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 trajet aller-retour (ping) contre toutes les balises disponibles, Gen2 ne considérera que les matchs dans une balise de ping spécifique. Cela présente une solution « douce » pour diviser votre base de joueurs, permettant de mettre en correspondance avec les régions voisines, surtout en améliorant la vitesse de match pour les régions moins peuplées. Utilisez max_latency pour éviter de vous appariement contre des joueurs situés loin.

Vous pouvez maintenant passer à l'étape suivante.

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

  • 200) et le reste est dans | A-B | >Alice et Bob vont être 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, Beijing : 264.4}; et

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

    200) et le reste est dans | A-B | >


  • Charlie et Dave ne vont pas être appariés, 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 latence » ne peuvent être définies qu'une seule fois dans vos règles de configuration initiales.

3. Revoir les détails de l'instance

Révisez les détails de votre nouveau matchmaker 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 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.

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

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

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

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

Vous pouvez maintenant passer à l'étape suivante.

4. Test de 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 « 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,

  • sélectionnez Voir les paramètres d'importation et changez le paramètre Génération de paramètres en Exemple.

Confirmez l'importation, cela créera une nouvelle collection apparaissant dans la liste des collections à gauche, intitulée Matchmaker.

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

  • Type d'authentification - Clé API,

  • Clé - « Authorization »

  • Valeur - insérez ici la valeur de votre AuthToken,

  • Ajouter à - Header.

Appuyez sur (CTRL/CMD+S) ou l'icône Enregistrer 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 requête de ticket de joueur :

remarquez player_ip est réglé sur null - cela utilisera l'adresse IP automatiquement ajoutée à votre demande (voir Intégration serveur à serveur pour des alternatives),

  • profil se réfère à votre profil de matchmaking,

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

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

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

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

  • id est votre identifiant unique de ticket de matchmaking, gardez ceci enregistré pour vérifier votre ticket plus tard,

  • profil confirmant le choix de profils de matchmaking,

  • group_id est un identifiant unique de groupe émis pour chaque ticket, un joueur solo étant 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 réglé sur null pour indiquer que le ticket n'a pas encore été associé ou attribué à un serveur,

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

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

Créez un deuxième ticket en appuyant de nouveau sur Envoyer, afin que nos deux joueurs 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 à l'étape précédente et cliquez sur Envoyer.

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

  • le statut est passé à MATCH_FOUND d'abord, tout en gardant assignment réglé sur null pour indiquer que les joueurs ont trouvé un match et qu'un serveur est en cours d'affectation,

Cliquez de nouveau sur Envoyer pour vérifier votre ticket, et examinez l'affectation 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 étiqueté avec tous les identifiants de tickets et profils pour plus de traçabilité.

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ème et que vous avez terminé les tests, arrêtez votre déploiement pour libérer de la capacité dans votre compte pour la prochaine construction.

Vous pouvez maintenant passer à l'étape suivante.

5. Intégrez 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 passées par leurs tickets,

    • facultativement pour prendre en charge le backfill pour ajouter ou remplacer des joueurs après le démarrage.

Pour le client de jeu, nous recommandons de fournir des mises à jour de statut de ticket tout au long du processus de matchmaking aux joueurs en utilisant l'interface utilisateur du jeu pour la meilleure expérience joueur. 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 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'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 les joueurs connectés, 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 complètement 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 backfill et la capacité des joueurs (ajouter ou remplacer des joueurs qui partent).

Assurez-vous que votre déploiement sera correctement arrêté en utilisant URL DELETE Injectée, 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 du Matchmaker d'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