Le Matchmaking en ligne brainCloud consiste à trouver (ou créer) un salon d'accueil adapté à l'utilisateur. Lors de ce processus, les participants potentiels sont placés dans une file d'attente. En dernier recours, si le développeur a spécifié un script de filtrage, les salons candidats lui seront transmis pour approbation finale avant d'être envoyés à l'application cliente. Voir le diagramme suivant: la vérification du script de filtrage est la dernière étape avant que l'utilisateur puisse rejoindre un salon.
Les critères de filtrage du script de filtrage de lobby peuvent être personnalisés selon vos besoins, mais en gros, en comparant simplement les données JSON du filtre lors de l'appel de FindLobby avec les configurations des lobbies candidats, qui peuvent être les métadonnées des lobbies ou les données personnalisées du propriétaire, voir les données suivantes auxquelles le script de filtrage du lobby peut accéder.
{
"step": 1,
"filter": {
"groupName": "group1",
"cheater": false,
"level": 5
},
"matchCandidate": {
"id": "13229:CursorPartyV2:29",
"lobbyType": "CursorPartyV2",
"state": "early",
"rating": 10,
"lobbyTypeDef": {
"roomConfig": {
"roomConfig_key3": false,
"roomConfig_key2": 99,
"roomConfig_key1": "customValue"
},
"lobbyTypeId": "CursorPartyV2",
"teams": {
"all": {
"minUsers": 1,
"maxUsers": 8,
"autoAssign": true,
"code": "all"
}
},
"rules": {
"allowEarlyStartWithoutMax": true,
"forceOnTimeStartWithoutReady": true,
"allowJoinInProgress": true,
"onTimeStartSecs": 300,
"disbandOnStart": false,
"everyReadyMinPercent": 0,
"everyReadyMinNum": 1,
"earliestStartSecs": 1,
"tooLateSecs": 300
},
"desc": "relay protocol version 2"
},
"settings": {
"groupName": "group1",
"cheater": false,
"level": 3
},
"version": 1,
"connectData": {},
"timetable": {
"createdAt": 1650419947323,
"early": 1650419948323,
"onTime": 1650420247323,
"tooLate": 1650420247323
},
"cRegions": [],
"round": 1,
"isRoomReady": false,
"ownerCxId": "13229:35620730-e2f0-468f-bc1d-700942de0b87:pggquikoeiqkj20kepu42175lr",
"legacyLobbyOwnerEnabled": false,
"numMembers": 1,
"members": [
{
"profileId": "35620730-e2f0-468f-bc1d-700942de0b87",
"name": "xx",
"pic": "",
"rating": 10,
"team": "all",
"isReady": false,
"extra": {
"colorIndex": 4
},
"cxId": "13229:35620730-e2f0-468f-bc1d-700942de0b87:pggquikoeiqkj20kepu42175lr"
}
]
},
"pingData": {}
}
L'exemple de script de filtre de lobby simple suivant vous montre comment utiliser les critères de filtre personnalisés pour filtrer les lobbys avec state
et les données personnalisées du propriétaire settings
lors de la création des lobbys.
"use strict";
function main() {
var response = {};
var is_accept = false;
bridge.logInfoJson("lobby filter data...", data);
var matchCandidate = data.matchCandidate;
var lobbyState = matchCandidate.state;
var lobbyRating = matchCandidate.rating;
// vérifier l'état, ne rejoindra pas si le lobby est déjà en train de démarrer
if (lobbyState != "starting")
{
var lobbySettings = matchCandidate.settings;
var filter = data.filter;
// vérifier si les données de filtre transmises par l'utilisateur correspondent aux données de paramètres du propriétaire
if (filter.groupName == lobbySettings.groupName &&
filter.level >= lobbySettings.level &&
filter.cheater == lobbySettings.cheater )
{
is_accept = true;
}
}
// l'objet retourné doit contenir le mot-clé 'accept' avec une valeur booléenne, le service de lobby vérifiera ce nom avec le code: `boolean isAccept = (Boolean) response.get("accept");`
response.accept = is_accept;
return response;
}
main();
Maintenant, testons ce script de filtre avec notre exemple RelayTestApp
, qui peut être trouvé dans la plupart des types de librairies clientes brainCloud sur GitHub, nous utiliserons node.js.
Après avoir créé le script ci-dessus à partir de l'éditeur de scripts, accédez à la page Configurer les lobbys, ouvrez un type de lobby et liez le script de filtre de lobby à ce type de lobby à partir de la liste déroulante
Filter Script
.
Modifiez l'exemple d'application
RelayTestApp
pour créer un lien vers votre application, créez-la et exécutez-la sur votre appareil local, puis connectez-vous à l'application avec un utilisateurxx
et cliquez sur le boutonPLAY GAME
pour créer un lobby en tant que propriétaire (méthode d'appel de codefindOrCreateLobby
, car aucune autre instance de lobby en cours d'exécution ne s'exécute sur votre build local, donc le premier utilisateur qui appelle cette méthode créera un lobby).(Notez que si aucun candidat au lobby n'est trouvé, le script de filtrage ne sera pas déclenché.)
Les arguments passés sont les suivants pour l'appel
findOrCreateLobby
.
// Rechercher ou créer un lobby
this.bc.lobby.findOrCreateLobby(lobbyType, 10, 3, { strategy: "ranged-absolute", alignment: "center", ranges: [1000] }, {}, null, {"groupName":"group1", "cheater":false, "level":3}, false, {colorIndex:this.state.user.colorIndex}, "all", result =>
{
if (result.status !== 200)
{
this.dieWithMessage("Failed to find lobby")
}
})
Exécutez le même localhost à partir d'un autre navigateur, connectez-vous à l'application avec un autre utilisateur et cliquez sur le bouton
PLAY GAME WITH FILTER SETTINGS
, il appelleraFindLobby
avec le filtre JSON répondant à la validation du script de filtre du lobby.
Les arguments passés sont les suivants pour
findLobby
l'appel.
// Trouver le lobby correspondant
this.bc.lobby.findLobby(lobbyType, 10, 3, { strategy: "ranged-absolute", alignment: "center", ranges: [1000] }, {"groupName":"group1", "cheater":false, "level":5}, null, false, {colorIndex:this.state.user.colorIndex}, "all", result =>
{
if (result.status !== 200)
{
this.dieWithMessage("Failed to find lobby")
}
})
Nous pouvons voir que le membre utilisateur
yy
a rejoint le lobby avec succès et nous pouvons savoir que le script de filtrage du lobby a été déclenché en vérifiant les informations du journal de l'application à partir de la page de surveillance.
Modifions maintenant l'une des conditions du script de filtrage sur "false", puis définissons-la
filter.level <= lobbySettings.level
(car le niveau JSON des données de filtrage transmises à l'utilisateur est supérieur de5
au niveau des paramètres du propriétaire, qui est de3
). L'utilisateuryy
quitte le lobby et le rejoint à nouveau. Nous pouvons constater que l'utilisateur ne parvient pas à rejoindre le lobby précédent avec le messageJOIN_FAIL
--No lobbies found matching criteria
.
PS. Rencontres en ligne (OMM)
Aperçu
Le matchmaking en ligne est le processus de recherche (ou de création) d'un lobby approprié pour l'utilisateur.
Lors du matchmaking, les participants potentiels sont placés dans une file d'attente/d'entrée.
Le système parcourt ensuite périodiquement tous les membres de la file d'attente, du plus ancien (numéro d'étape le plus élevé) au plus bas, à la recherche de lobbies appropriés et en créant un nouveau lobby pour cet utilisateur si nécessaire.
Si le développeur a spécifié un script de filtrage, les lobbies candidats lui seront transmis pour approbation finale avant de l'envoyer à l'application cliente.
Le processus lobbyQueue doit:
exécuter toutes les <x> secondes
quitter immédiatement s'il n'y a aucun participant dans la file d'attente
Données
Les informations suivantes sont également stockées sur le candidat dans la file d'attente:
cx
- l'identifiant de connexion de l'utilisateurprofileId
- l'identifiant du profil de l'utilisateur (séparé pour chaque utilisation dans le filtre de matchmaking)lobbyType
- le type de file d'attente dans laquelle l'utilisateur attendrating
- la note de compétence du candidatstep
- l'étape/le stade/l'itération actuel de l'utilisateur dans le matchmakingmaxSteps
- le nombre maximal d'étapes à attendre lors de la recherche. Les étapes se produisent environ toutes les 2 secondes.algo
- l'algorithme d'étape de notation à utiliserfilter
- les critères de filtrage personnalisésready
- booléen pour indiquer si le participant doit être prêt lorsqu'il est ajouté au lobbyextraJson
- données supplémentaires sur le participant (à utiliser lors de l'ajout du participant au lobby)team
- l'équipe à laquelle ajouter le joueur. Peut-être"".create
- créer un lobby si nous atteignons maxSteps?settings
- si create == true, alors ces paramètres seront utilisés comme paramètres du propriétaire pour le lobby...
Algorithmes par étapes
Le système de matchmaking peut être programmé en complétant une structure algorithmique pour le pas à pas. Cette structure se présente comme suit: si maxSteps est supérieur aux plages incluses, la dernière plage spécifiée est utilisée.
{
"strategy": "ranged-percent",
"alignment": "center",
"ranges": [ 5, 5, 7.5, 7.5, 10, 10, 12.5, 12.5, 15, 15 ]
}
Les valeurs d’algorithme suivantes sont actuellement prises en charge:
strategy
- permet de sélectionner l'algorithme de notation global. Les variantes suivantes sont prises en charge:ranged-percent
- les plages fournies sont interprétées comme des pourcentages à appliquer à la note de l'utilisateur pour le matchmaking.ranged-absolute
- les plages fournies sont interprétées comme des valeurs absolues à ajouter/soustraire de la note de l'utilisateur lors du calcul de la plage pour le matchmakingcompound
- une forme particulière de stratégie prenant en charge les algorithmes imbriqués. Voir l'exemple.
alignment
- détermine comment la plage est alignée avec la note de l'utilisateurplages: un tableau de valeurs de plages à appliquer à l'algorithme. Remarque: si l'étape actuelle est supérieure à la valeur fournie dans la plage, la dernière valeur de la plage est utilisée.
Exemple utilisant l'algorithme compound
- sélectionner le lobby en fonction du ping puis de la note
{
"strategy": "compound",
"algos" [
{ "criteria": "ping", "strategy": "ranged-percent", "alignment": "center" },
{ "criteria": "rating", "strategy": "ranged-percent", "alignment": "center" }
],
"compound-ranges": [
[ 30, [ 5, 7.5 ]],
[ 60, [ 5, 5, 7.5, 7.5, 10, 10 ]],
[ 130, [ 5, 7.5, 10, 12.5, 15]]
]
}
Les options suivantes d'alignment
sont disponibles et montrent comment elles affecteraient une plage de +/- 10 pour un classement de 80.
alignment | min | max | description |
| 80 | 100 | Garantit que les salons doivent avoir un niveau de skill >= à celui du candidat. La valeur minimale est égale à la valeur du joueur et la valeur maximale est ajoutée à 200% de la portée. |
| 75 | 95 | Soustrait 50% de la plage pour le min et ajoute 150% de la plage au max. |
| 70 | 90 | Centre la plage autour du rating du candidat. |
| 65 | 85 | Soustrait 150% de la plage pour le minimum et ajoute 50% de la plage au maximum. |
| 60 | 80 | Garantit que les salons auront un skill rating <= à celui du candidat. Soustrait 200% de la plage de niveaux pour calculer le minimum, et conserve le maximum comme niveau du joueur. |