Comprende el algoritmo
Es necesario equilibrar cada equipo al comienzo la partida para que tenga una cantidad adecuada de jugadores.
A diferencia de los juegos en los que el equilibrio de jugadores es simétrico y estos se distribuyen de manera uniforme entre los equipos, el equilibrio asimétrico significa que cada equipo debe tener un número relativo de jugadores. En otras palabras, el tamaño de los equipos debe seguir una proporción relativa.
Por ejemplo, puede que siempre quieras que un equipo tenga el doble de jugadores que otro. A medida que se unen los jugadores hay que equilibrarlos de forma que se mantenga este número relativo. En los modos de juego en los que un equipo es más poderoso o tiene habilidades diferentes que el otro, el equilibrio asimétrico crea experiencias de juego más fluidas al distribuir cuidadosamente el número de jugadores de cada equipo.
En este caso, tienes que asegurarte de que los equipos cuyo número máximo de jugadores es mayor (en este caso, los defensores) siempre tendrán más jugadores que los equipos con un máximo menor (como los infiltrados).
Para distribuir correctamente a los jugadores, tendrás que colocar a cada jugador en el equipo con la mayor diferencia respecto de su número máximo de jugadores.
Para ello, por cada nuevo jugador, tendrás que comprobar cada equipo, y guardar una referencia tanto del número máximo y actual de jugadores en ese equipo, así como del equipo al que se asignará este jugador. Puedes restar el número máximo de jugadores del número actual para obtener la diferencia con el máximo. Cuando encuentres un equipo donde la diferencia respecto del máximo es mayor, establecerás la asignación del jugador a ese equipo.
Al iterar por cada equipo, te aseguras de encontrar el equipo con la mayor diferencia.
Cómo definir el algoritmo
Este paso muestra cómo equilibrar los equipos de jugadores de forma asimétrica al comenzar la partida.
- Añade un nuevo método llamado
BalanceTeams()a la clasetriad_infiltration_game. Este método asigna un jugador al equipo con la mayor diferencia respecto a su número máximo de jugadores.# Equilibra a todos los jugadores en todos los equipos del juego. BalanceTeams():void= Logger.Print("Equilibrando equipos") - Obtén todos los jugadores del juego y almacénalos en una matriz variable
AllPlayers. Luego, mezclaAllPlayers. Esto garantizará que se asignen los jugadores a los equipos de forma aleatoria, y no en función del orden en que se unieron al comienzo de la partida.# Equilibra a todos los jugadores en todos los equipos del juego. BalanceTeams():void= Logger.Print("Equilibrando equipos") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) - Ahora tendrás que iterar a través de todos los jugadores y asignarlos al equipo con la mayor diferencia respecto a su número máximo de jugadores. Vas a hacer esto a través de una función de ayuda que crearás en el siguiente paso llamada
FindTeamWithLargestDifference(), pero primero, inicializa una variable de opción llamadaTeamToAssignpara asignar un jugador, y establécela en el valor devuelto porFindTeamWithLargestDifference().for (TeamPlayer:AllPlayers): var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() - Crea la función
FindTeamWithLargestDifference()en la definición de la clasetriad_infiltration_game. Esta función se encargará de encontrar el equipo con la mayor diferencia en el número de jugadores respecto a su máximo, y devuelve unequipoopcional. Necesitarás que elteamdevuelto sea una opción para evitar reasignar a un jugador cuando ya está en el equipo con mayor diferencia.# Identifica al equipo con la mayor diferencia en su número de jugadores a partir del # número máximo de jugadores. FindTeamWithLargestDifference():?team = Logger.Print("Se está intentando encontrar el equipo con menor número de jugadores.") - Inicializa una variable de equipo opcional llamada
TeamToAssignque almacenará una referencia al equipo con la mayor diferencia en jugadores, y un enteroLargestDifferencepara registrar esa diferencia en jugadores.# Identifica al equipo con la mayor diferencia en su número de jugadores a partir del # número máximo de jugadores. FindTeamWithLargestDifference():?team = Logger.Print("Se está intentando encontrar el equipo con menor número de jugadores.") var TeamToAssign:?team = false var LargestDifference:int = 0 - Ahora itera a través de la lista de equipos para obtener tanto el tamaño actual como el máximo de ese equipo.
var TeamToAssign:?team = false var LargestDifference:int = 0 for: CandidateTeam:Teams CurrentTeamSize := GetPlayspace().GetTeamCollection().GetAgents[CandidateTeam].Length MaximumTeamSize := TeamsAndTotals[CandidateTeam] - Para cada equipo, calcula la
DifferenceFromMaximum, que es la diferencia entre el tamaño máximo de este equipo y el número de jugadores que tiene actualmente. Si el equipo tiene una diferencia mayor queLargestDifference, estableceLargestDifferenceenDifferenceFromMaximum, y ajustaTeamToAssignen unaoption.for: CandidateTeam:Teams CurrentTeamSize := GetPlayspace().GetTeamCollection().GetAgents[CandidateTeam].Length MaximumTeamSize := TeamsAndTotals[CandidateTeam] do: Logger.Print("Revisando un equipo...") Logger.Print("El tamaño máximo de este equipo es {MaximumTeamSize}.") DifferenceFromMaximum := MaximumTeamSize - CurrentTeamSize Logger.Print("La diferencia con el máximo es {DifferenceFromMaximum}.") if(LargestDifference < DifferenceFromMaximum): set LargestDifference = DifferenceFromMaximum set TeamToAssign = option{CandidateTeam} Logger.Print("Se encontró un equipo con menor número que el máximo de jugadores: {DifferenceFromMaximum}.") - Por último, devuelve
TeamToAssign. Tu códigoFindTeamWithLargestDifference()debería verse de la siguiente manera:# Identifica al equipo con la mayor diferencia en su número de jugadores a partir del # número máximo de jugadores. FindTeamWithLargestDifference():?team = Logger.Print("Se está intentando encontrar el equipo con menor número de jugadores.") var TeamToAssign:?team = false var LargestDifference:int = 0 for: CandidateTeam:Teams CurrentTeamSize := GetPlayspace().GetTeamCollection().GetAgents[CandidateTeam].Length MaximumTeamSize := TeamsAndTotals[CandidateTeam] do: Logger.Print("Revisando un equipo...") Logger.Print("El tamaño máximo del equipo {CandidateTeamIndex + 1} es {MaximumTeamSize}.") DifferenceFromMaximum := MaximumTeamSize - CurrentTeamSize Logger.Print("La diferencia con el mínimo es {DifferenceFromMaximum}.") if(LargestDifference < DifferenceFromMaximum): set LargestDifference = DifferenceFromMaximum set TeamToAssign = option{CandidateTeam} Logger.Print("Se encontró un equipo con menor número que el mínimo de jugadores: {DifferenceFromMaximum}.") return TeamToAssign - De vuelta en
BalanceTeams(), asigna el jugador a un nuevo equipo a través de la funciónFortTeamCollection.AddToTeam[]. Si esta asignación falla, el jugador ya estaba en el equipo más pequeño.var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, FortTeamCollection.AddToTeam[TeamPlayer, AssignedTeam]): Logger.Print("Se está intentando asignar un jugador a un nuevo equipo.") - Tu función
BalanceTeams()debería verse de la siguiente manera:# Equilibra a todos los jugadores en todos los equipos del juego. BalanceTeams():void= Logger.Print("Equilibrando equipos") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) Logger.Print("El largo de AllPlayers es {AllPlayers.Length}.") for (TeamPlayer:AllPlayers): var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, FortTeamCollection.AddToTeam[TeamPlayer, AssignedTeam]): Logger.Print("Se asignó un jugador a un nuevo equipo.")
Cómo teletransportar jugadores a sus áreas de aparición
Aunque los jugadores terminarán en el equipo con la mayor diferencia, es posible que no aparezcan en la zona correcta. Esto puede ser porque los jugadores aparecen antes de equilibrarse en el equipo nuevo. Para controlar esto, crearás una función nueva para teletransportar jugadores a sus zonas de aparición después de que los equipos estén equilibrados.
- Crea la función
TeleportPlayersToStartLocations()en la definición de clasetriad_infiltration_game. Esta función teletransportará jugadores a la zona de aparición de su equipo una vez que finalice la tarea de equilibrio.# Teletransporta jugadores a la zona de aparición de su equipo una vez que finaliza la tarea de equilibrio. TeleportPlayersToStartLocations():void= Logger.Print("Se está teletransportando a los jugadores a las posiciones de inicio.") - En un bucle
for, itera a través de cada equipo en la matrizTeams, obtén el índice de ese equipo y almacénalo en una variableTeamIndex.# Teletransporta jugadores a la zona de aparición de su equipo una vez que finaliza la tarea de equilibrio. TeleportPlayersToStartLocations():void= Logger.Print("Se está teletransportando a los jugadores a las posiciones de inicio.") for: TeamIndex -> PlayerTeam:Teams - Coloca a los jugadores en
PlayerTeam. Para ello, llama a la funciónGetAgents[]mediantePlayerTeam. Para hacerlo, indéxalo en la matrizTeleportersmedianteTeamIndexy almacénalo en una variableTeamTeleporter. Almacena la transformación de ese teletransportador en una variableTransform.# Teletransporta jugadores a la zona de aparición de su equipo una vez que finaliza la tarea de equilibrio. TeleportPlayersToStartLocations():void= Logger.Print("Se está teletransportando a los jugadores a las posiciones de inicio.") for: TeamIndex -> PlayerTeam:Teams TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[PlayerTeam] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform()Procura que el orden de los equipos en
Teamscoincida con el orden de los teletransportadores enTeleporters. Si los infiltrados son el Equipo 1, entonces el primer teletransportador enTeleportersdebería ser para los infiltrados. Comprueba en el editor que estos valores sean correctos. - Ahora, en un segundo bucle
for, itera a través de cada jugador enTeamPlayersy utilizaRespawn()y la traslación y rotación deTransformpara hacerlos reaparecer en la transformación del teletransportador. La funciónTeleportPlayersToStartLocations()debe verse de la siguiente manera:# Teletransporta jugadores a la zona de aparición de su equipo una vez que finaliza la tarea de equilibrio. TeleportPlayersToStartLocations():void= Logger.Print("Se está teletransportando a los jugadores a las posiciones de inicio.") 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("Se teletransportó a este jugador a su posición de inicio.") - En
OnBegin(), añade una llamada aBalanceTeams()después de mezclarAllPlayers. Esto garantizará que los jugadores se equilibren en un orden aleatorio en lugar de acabar siempre en el mismo equipo. A continuación, llama a la funciónTeleportPlayersToStartLocations()para teletransportar a los jugadores a sus ubicaciones de inicio.OnBegin<override>()<suspends> : void = # Obtén todos los equipos set Teams = GetPlayspace().GetTeamCollection().GetTeams() # Guarda los equipos para consultarlos luego set MaybeInfiltrators = option{Teams[0]} set MaybeAttackers = option{Teams[1]} set MaybeDefenders = option{Teams[2]} if: Infiltrators := MaybeInfiltrators? Attackers := MaybeAttackers? Defenders := MaybeDefenders? Logger.Print("Se encontró a los tres equipos.") set TeamsAndTotals[Infiltrators] = MaximumInfiltrators set TeamsAndTotals[Attackers] = MaximumAttackers set TeamsAndTotals[Defenders] = MaximumDefenders Logger.Print("Se utilizó la variable set en los tres equipos en TeamsAndTotals.") then: BalanceTeams() TeleportPlayersToStartLocations() else: Logger.Print("No se pudo encontrar a todos los equipos. Asegúrate de asignar los equipos correctos en los ajustes de la isla.") -
Guarda la secuencia de comandos, compílala y haz clic en Comenzar sesión en la barra de herramientas de UEFN para probar el nivel. Cuando realices la prueba del nivel, cada jugador debería estar en el equipo con mayor diferencia y aparecer en el área de aparición de ese equipo. Comprueba este comportamiento en el registro. Puedes ajustar el número máximo de jugadores por equipo en tu
triad_infiltration_gamepara probar esta funcionalidad cuando tengas menos jugadores que la cantidad máxima. Por ejemplo, cuando pruebes en solitario, intenta que el máximo número de jugadores del equipo en el que quieres quedar sea superior al de los otros dos equipos. Si quieres quedar en el equipo de los atacantes, establece el número deMaximumAttackersmás alto. Si quieres quedar en el de los infiltrados, estableceMáximoInfiltradosmás alto.
Próximo paso
En el siguiente paso de este tutorial, aprenderás a asignar armas a los jugadores al comienzo de la partida y cuando aparecen.