Comprendre l'algorithme
Il est souhaitable que les équipes soient équilibrées au début du jeu.
Contrairement aux jeux où l'équilibrage des joueurs est symétrique et où les joueurs sont répartis uniformément entre les équipes, l'équilibrage asymétrique des équipes signifie que chaque équipe doit avoir un nombre relatif de joueurs. En d'autres termes, la taille des équipes doit suivre un rapport relatif.
Par exemple, vous pourriez souhaiter qu'une équipe ait toujours deux fois plus de joueurs qu'une autre. Au fur et à mesure que les joueurs rejoignent la partie, vous devez les équilibrer de manière à préserver ce nombre relatif. Dans les modes de jeu où une équipe est plus puissante ou possède des capacités différentes de l'autre équipe, l'équilibrage asymétrique crée des expériences de jeu plus fluides en répartissant soigneusement le nombre de joueurs dans chaque équipe.
Dans cet exemple, vous devez vous assurer que les équipes ayant un nombre maximum de joueurs plus élevé (dans ce cas, les défenseurs) auront toujours plus de joueurs que les équipes ayant un maximum inférieur (comme les infiltrés).
Pour répartir les joueurs correctement, vous devrez placer chaque joueur dans l'équipe présentant la plus grande différence par rapport à son nombre maximum de joueurs.
À cet effet, pour chaque nouveau joueur, vous devez vérifier chaque équipe et stocker une référence au nombre maximal et au nombre actuel de joueurs de cette équipe, ainsi qu'à l'équipe à laquelle affecter ce joueur. Vous pouvez soustraire le nombre actuel de joueurs du maximum afin d'obtenir la différence par rapport au maximum. L'équipe qui présente la plus grande différence par rapport au maximum est logiquement celle à laquelle affecter le joueur.
En itérant sur chaque équipe, vous vous assurez de trouver l'équipe qui présente la plus grande différence.
Définir l'algorithme
Cette étape vous apprendra à équilibrer les équipes de joueurs de façon asymétrique au début du jeu.
- Ajoutez une nouvelle méthode appelée
BalanceTeams()à la classetriad_infiltration_game. Cette méthode affecte un joueur à l'équipe présentant la plus grande différence par rapport à son nombre maximal de joueurs.# Répartit les joueurs dans l'ensemble des équipes de la partie BalanceTeams():void= Logger.Print("Beginning to balance teams") - Obtenir tous les joueurs de la partie et les stocker dans une matrice variable
AllPlayers. Mélanger ensuiteAllPlayers. Cela garantira la répartition aléatoire des joueurs dans les équipes, et non en fonction de l'ordre dans lequel ils ont initialement rejoint le jeu.# Répartit les joueurs dans l'ensemble des équipes de la partie BalanceTeams():void= Logger.Print("Beginning to balance teams") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) - Vous n'avez plus qu'à itérer sur tous les joueurs et les affecter à l'équipe présentant la plus grande différence par rapport à son nombre maximal de joueurs. Pour cela, vous allez utiliser une fonction d'assistance nommée
FindTeamWithLargestDifference()que vous créerez à l'étape suivante. Avant cela, initialisez une variable d'option nomméeTeamToAssignà laquelle affecter un joueur, puis définissez-la sur la valeur renvoyée parFindTeamWithLargestDifference().for(TeamPlayer:AllPlayers): var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() - Créez la fonction
FindTeamWithLargestDifference()dans la définition de classetriad_infiltration_game. Cette fonction se chargera de trouver l'équipe présentant la plus grande différence entre le nombre de joueurs et son maximum et renverra éventuellement uneteamen option. Afin d'empêcher la réaffectation d'un joueur lorsqu'il se trouve déjà dans l'équipe présentant la plus grande différence, il faut que lateamrenvoyée soit une option.# Trouve l'équipe ayant la plus grande différence entre son nombre de joueurs actuels et son # nombre maximum de joueurs FindTeamWithLargestDifference():?team = Logger.Print("Attempting to find smallest team") - Initialisez une variable d'équipe optionnelle nommée
TeamToAssignqui stockera une référence à l'équipe ayant la plus grande différence de joueurs, ainsi qu'un nombre entierLargestDifferencepour suivre cette différence de joueurs.# Trouve l'équipe ayant la plus grande différence entre son nombre de joueurs actuels et son # nombre maximum de joueurs. FindTeamWithLargestDifference():?team = Logger.Print("Attempting to find smallest team") var TeamToAssign:?team = false var LargestDifference:int = 0 - Maintenant, itérez sur la liste des équipes, en obtenant à la fois la taille actuelle et la taille maximale de cette équipe.
var TeamToAssign:?team = false var LargestDifference:int = 0 for: CandidateTeam:Teams CurrentTeamSize := GetPlayspace().GetTeamCollection().GetAgents[CandidateTeam].Length MaximumTeamSize := TeamsAndTotals[CandidateTeam] - Pour chaque équipe, calculez la
DifferenceFromMaximum, qui est la différence entre la taille maximale de cette équipe et le nombre de joueurs qu'elle contient actuellement. Si l'équipe présente une différence plus grande queLargestDifference, définissezLargestDifferencesurDifferenceFromMaximumet enveloppezTeamToAssigndans uneoption.for: CandidateTeam:Teams CurrentTeamSize := GetPlayspace().GetTeamCollection().GetAgents[CandidateTeam].Length MaximumTeamSize := TeamsAndTotals[CandidateTeam] do: Logger.Print("Checking a team...") Logger.Print("Maximum size of this team is {MaximumTeamSize}") DifferenceFromMaximum := MaximumTeamSize - CurrentTeamSize Logger.Print("Difference from maximum is {DifferenceFromMaximum}") if(LargestDifference < DifferenceFromMaximum): set LargestDifference = DifferenceFromMaximum set TeamToAssign = option{CandidateTeam} Logger.Print("Found a team under maximum players: {DifferenceFromMaximum}") - Enfin, renvoyez
TeamToAssign. Votre codeFindTeamWithLargestDifference()doit à présent ressembler à ceci :# Trouve l'équipe ayant la plus grande différence entre son nombre de joueurs actuels et son # nombre maximum de joueurs. FindTeamWithLargestDifference():?team = Logger.Print("Attempting to find smallest team") var TeamToAssign:?team = false var LargestDifference:int = 0 for: CandidateTeam:Teams CurrentTeamSize := GetPlayspace().GetTeamCollection().GetAgents[CandidateTeam].Length MaximumTeamSize := TeamsAndTotals[CandidateTeam] do: Logger.Print("Checking a team...") Logger.Print("Maximum size Maximum size of team {CandidateTeamIndex + 1} is {MaximumTeamSize}") DifferenceFromMaximum := MaximumTeamSize - CurrentTeamSize Logger.Print("Difference from minimum is {DifferenceFromMaximum}") if(LargestDifference < DifferenceFromMaximum): set LargestDifference = DifferenceFromMaximum set TeamToAssign = option{CandidateTeam} Logger.Print("Found a team under minimum players: {DifferenceFromMaximum}") return TeamToAssign - De retour dans
BalanceTeams(), assignez le joueur à une nouvelle équipe par l'intermédiaire de la fonctionFortTeamCollection.AddToTeam[]. Si cette assignation échoue, c'est que le joueur était déjà dans la plus petite équipe.var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, FortTeamCollection.AddToTeam[TeamPlayer, AssignedTeam]): Logger.Print("Attempting to assign player to a new team") - Votre fonction
BalanceTeams()doit ressembler à ce qui suit :# Répartit les joueurs dans l'ensemble des équipes de la partie BalanceTeams():void= Logger.Print("Beginning to balance teams") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) Logger.Print("AllPlayers Length is {AllPlayers.Length}") for(TeamPlayer:AllPlayers): var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, FortTeamCollection.AddToTeam[TeamPlayer, AssignedTeam]): Logger.Print("Assigned player to a new team")
Téléporter les joueurs dans leurs zones d'apparition
Même si les joueurs se retrouvent dans l'équipe ayant la plus grande différence, il est possible qu'ils n'apparaissent pas dans la zone correcte. Cela s'explique par le fait que les joueurs apparaissent avant d'être équilibrés dans une nouvelle équipe. Pour corriger ce problème, vous allez créer une nouvelle fonction pour téléporter les joueurs dans leur zone d'apparition après l'équilibrage des équipes.
- Créez la fonction
TeleportPlayersToStartLocations()dans la définition de la classetriad_infiltration_game. Cette fonction téléporte les joueurs dans la zone d'apparition de leur équipe une fois l'équilibrage terminé.# Téléporte les joueurs au point d'apparition de leur équipe une fois l'équilibrage des équipes terminé. TeleportPlayersToStartLocations():void= Logger.Print("Teleporting players to start locations") - Dans une boucle
for, itérez à travers chaque matriceTeams, obtenez l'indice de cette équipe et stockez-le dans une variable appeléeTeamIndex.# Téléporte les joueurs au point d'apparition de leur équipe une fois l'équilibrage des équipes terminé. TeleportPlayersToStartLocations():void= Logger.Print("Teleporting players to start locations") for: TeamIndex -> PlayerTeam:Teams - Obtenez les joueurs de l'équipe
PlayerTeamen appelantGetAgents[]avecPlayerTeam. Obtenez ensuite le téléporteur associé à cette équipe en indexant la matriceTeleportersà l'aide deTeamIndexet en la stockant dans une variableTeamTeleporter. Stockez la transformation de ce téléporteur dans une variableTransform.# Téléporte les joueurs au point d'apparition de leur équipe une fois l'équilibrage des équipes terminé. TeleportPlayersToStartLocations():void= Logger.Print("Teleporting players to start locations") for: TeamIndex -> PlayerTeam:Teams TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[PlayerTeam] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform()Assurez-vous que l'ordre de vos équipes dans
Teamscorrespond à l'ordre de vos téléporteurs dansTeleporters. Si les infiltrés sont l'équipe 1, le premier téléporteur dansTeleportersdoit être destiné aux infiltrés. Vérifiez à nouveau dans l'éditeur que ces valeurs sont correctes. - Maintenant, dans une seconde boucle
for, itérez chaque joueur deTeamPlayerset faites-le réapparaître à la transformation du téléporteur en utilisantRespawn()ainsi que la translation et la rotation deTransform. Votre fonctionTeleportPlayersToStartLocations()doit être similaire à celle-ci :# Téléporte les joueurs au point d'apparition de leur équipe une fois l'équilibrage des équipes terminé. TeleportPlayersToStartLocations():void= Logger.Print("Teleporting players to start locations") for: TeamIndex -> PlayerTeam:Teams TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[PlayerTeam] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: for(TeamPlayer:TeamPlayers): TeamPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Teleported this player to their start location") - Dans
OnBegin(), ajoutez un appel àBalanceTeams()après avoir mélangéAllPlayers. Cela garantira l'équilibrage des joueurs dans un ordre aléatoire plutôt qu'une répartition dans la même équipe à chaque fois. Téléportez ensuite les joueurs à leur emplacement de départ en appelantTeleportPlayersToStartLocations().OnBegin<override>()<suspends> : void = # Obtenir toutes les équipes set Teams = GetPlayspace().GetTeamCollection().GetTeams() # Enregistrez les équipes pour y faire référence ultérieurement. set MaybeInfiltrators = option{Teams[0]} set MaybeAttackers = option{Teams[1]} set MaybeDefenders = option{Teams[2]} if: Infiltrators := MaybeInfiltrators? Attackers := MaybeAttackers? Defenders := MaybeDefenders? Logger.Print("Found all three teams") set TeamsAndTotals[Infiltrators] = MaximumInfiltrators set TeamsAndTotals[Attackers] = MaximumAttackers set TeamsAndTotals[Defenders] = MaximumDefenders Logger.Print("Set all three teams in TeamsAndTotals") then: BalanceTeams() TeleportPlayersToStartLocations() else: Logger.Print("Couldn't find all teams, make sure to assign the correct teams in your island settings.") -
Enregistrez le script, compilez-le, puis cliquez sur Lancer la session dans la barre d'outils de l'UEFN pour tester le niveau. Lorsque vous testez votre niveau, chaque joueur doit rejoindre l'équipe présentant la plus grande différence et apparaître dans la zone d'apparition de cette équipe. Vérifiez ce comportement en utilisant le journal. Vous pouvez ajuster le nombre maximum de joueurs par équipe dans votre jeu
triad_infiltration_gameafin de tester cette fonctionnalité lorsque vous disposez d'un nombre de joueurs inférieur au nombre maximum. Par exemple, lorsque vous testez seul, essayez de définir le nombre maximum de joueurs de l'équipe que vous tentez de rejoindre sur une valeur plus élevée que les deux autres équipes. Si vous souhaitez rejoindre les attaquants, augmentez la valeur deMaximumAttackers. Si vous souhaitez rejoindre les infiltrés, augmentez la valeur deMaximumInfiltrators.
Étape suivante
À l'étape suivante de ce tutoriel, vous allez apprendre à attribuer des armes aux joueurs au début de la partie et lors de leurs apparitions.