Cuando un nuevo jugador se une al juego, hay que equilibrarlo asimétricamente en el equipo adecuado. Si ese equipo son los infiltrados, también deben tener asociada una instancia de OnInfiltratorDamaged().
Sigue los pasos que se indican a continuación para aprender a equilibrar a los jugadores en el equipo correcto cuando se unen a la partida en curso.
Cómo configurar las funciones de incorporación de jugadores
- Añade una nueva función,
OnInfiltratorJoined()a la definición de la claseinvisibility_manager. Esta función toma un agente y crea una instancia deOnInfiltratorDamaged()con el agente dado. Añade el especificador<public>a esta función, ya que la llamarás desdetriad_infiltration_game.# Genera una función OnInfiltratorDamaged cuando un nuevo infiltrado se une al juego. OnInfiltratorJoined<public>(InAgent:agent):void= spawn{OnInfiltratorDamaged(InAgent)} - Añade una nueva función
OnPlayerAdded()a la definición de la clasetriad_infiltration_game. Esta función toma un jugador, lo equilibra en el equipo correcto y llama aOnInfiltratorJoined()si el nuevo jugador es un infiltrado.# Gestiona a un nuevo jugador que se une al juego. OnPlayerAdded(InPlayer:player):void= - Obtén la
fort_team_collectiondel espacio de juego actual y guárdala en una variableFortTeamCollection.# Gestiona a un nuevo jugador que se une al juego. OnPlayerAdded(InPlayer:player):void= Logger.Print("Se ha unido un nuevo jugador; asignándolo a un equipo") FortTeamCollection := GetPlayspace().GetTeamCollection()Cómo refactorizar el equilibrio de equipos
- Necesitas equilibrar al nuevo jugador en el equipo correcto, pero si llamas a
BalanceTeams()acabarás reorganizando a cada jugador en un nuevo equipo. En lugar de reescribir el código para encontrar el equipo más pequeño para el nuevo jugador y equilibrarlo en él, esta es una buena oportunidad para refactorizar.- Añade un nuevo método
BalancePlayer()a la definición de la clasetriad_infiltration_game. Este método toma a un jugador y lo ubica asimétricamente de forma equilibrada en el equipo correcto.# Para cada jugador, se itera por la lista de equipos y se asignan al # equipo con menos jugadores o al equipo inicial en caso de empate. BalancePlayer(InPlayer:player):void= Logger.Print("Empezando a equilibrar los jugadores.") - Extrae el código del bucle
fordeBalanceTeams()y colócalo dentro deBalancePlayer(), cambiando el nombre deTeamPlayerporInPlayer. Tu códigoBalancePlayer()debería ser como el siguiente:# Para cada jugador, se itera por la lista de equipos y se asignan al # equipo con menos jugadores o al equipo inicial en caso de empate. BalancePlayer(InPlayer:player):void= Logger.Print("Empezando a equilibrar los jugadores.") var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, GetPlayspace().GetTeamCollection().AddToTeam[InPlayer, AssignedTeam]): Logger.Print("Intentando asignar un jugador recién unido a un nuevo equipo") else: Logger.Print("Este jugador ya estaba en el equipo más pequeño") - Ahora, en
BalanceTeams(), añade una llamada aBalancePlayer()dentro del buclefor. Esto conserva la funcionalidad deBalanceTeams()al tiempo que te permite equilibrar a un jugador individualmente. Tu códigoBalanceTeams()debería tener el siguiente aspecto:# Equilibra a todos los jugadores de todos los equipos del juego. BalanceTeams():void= Logger.Print("Empezando a equilibrar los equipos") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) Logger.Print("La longitud de AllPlayers es {AllPlayers.Length}") for (TeamPlayer:AllPlayers): BalancePlayer(TeamPlayer)
- Añade un nuevo método
- En
OnPlayerAdded(), añade una llamada aBalancePlayer()pasando al jugador que se acaba de unir.# Gestiona a un nuevo jugador que se une al juego. OnPlayerAdded(InPlayer:player):void= Logger.Print("Se ha unido un nuevo jugador; asignándolo a un equipo") FortTeamCollection := GetPlayspace().GetTeamCollection() set AllPlayers = GetPlayspace().GetPlayers() # Asigna al nuevo jugador al equipo más pequeño BalancePlayer(InPlayer) - Encuentra el índice del equipo del jugador después de equilibrar al iterar cada equipo en la matriz
Teamsy usarGetTeam[]como filtro para comprobar que es igual aPlayerTeam.# Gestiona a un nuevo jugador que se une al juego. OnPlayerAdded(InPlayer:player):void= Logger.Print("Se ha unido un nuevo jugador; asignándolo a un equipo") FortTeamCollection := GetPlayspace().GetTeamCollection() # Asigna al nuevo jugador al equipo más pequeño, de forma asimétrica. BalancePlayer(InPlayer) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] - Obtén el teletransportador asociado al equipo del jugador al indexar en la matriz
TeleportersmedianteTeamIndexy almacenarlo en una variableTeamTeleporter. Guarda la transformación de ese teletransportador en una variableTransform. A continuación, vuelve a situar al nuevo jugador en el teletransportador inicial de su equipo.for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Se ha teletransportado al jugador que ha aparecido a su ubicación inicial.") - Por último, comprueba si el jugador que se acaba de unir es un infiltrado comparando su equipo con la opción
Infiltratorsque configuraste anteriormente. Si lo están, llama aOnInfiltratorJoined()de la claseinvisibility_manageren el nuevo jugador para que empiece a parpadear. Tu códigoOnPlayerAdded()debería tener el siguiente aspecto:# Gestiona a un nuevo jugador que se une al juego. OnPlayerAdded(InPlayer:player):void= Logger.Print("Se ha unido un nuevo jugador; asignándolo a un equipo") FortTeamCollection := GetPlayspace().GetTeamCollection() # Asigna al nuevo jugador al equipo más pequeño, de forma asimétrica. BalancePlayer(InPlayer) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Se ha teletransportado al jugador que ha aparecido a su ubicación inicial.") # Si el jugador era un infiltrado, se llama a OnInfiltratorJoined en # InvisibilityManager. if(PlayerTeam = MaybeInfiltrators?): InvisibilityManager.OnInfiltratorJoined(InPlayer) - Guarda la secuencia de comandos, compílala y haz clic en Abrir sesión en la barra de herramientas de UEFN para poner a prueba el nivel. Cuando pruebes tu nivel, los jugadores deben unirse al equipo correcto cuando se unan a una partida en curso. Si ese jugador es un infiltrado, debería aparecer invisible y parpadear al recibir daño.
Siguiente paso
En el siguiente paso de este tutorial, aprenderás a crear un indicador visual para un jugador cuando captura un objetivo.