Cómo configurar los equipos
En esta sección, aprenderás a configurar el equipo cazador y el equipo utilería al comienzo de la partida, y a teletransportarlos a sus áreas de inicio.
En esta página, se incluyen fragmentos de Verse que muestran cómo ejecutar las mecánicas de juego que son necesarias en este. Sigue los pasos que aparecen a continuación y copia la secuencia completa de comandos en el paso 6 de este tutorial.
Sigue estos pasos para configurar los equipos de forma correcta:
-
Crea una nueva función SetupTeams(). Aquí configurarás múltiples suscripciones a funciones que definirás más tarde, como funciones que son útiles cuando se elimina una utilería o para saber qué hacer cuando un jugador se une al juego.
# Cuando se inicie una ronda, suscríbete a los dispositivos de equipo, elige al azar a los agentes cazadores, activa el cronómetro de cazadores, coloca a los agentes de utilería y teletranspórtalos al área de juego. SetUpTeams()<suspends>:void = Logger.Print("Se están estableciendo los equipos.") -
Primero, suscríbete al cronómetro de puntaje SuccessEvent del equipo utilería y al evento eliminado del TeamManager de este equipo, y establece el puntaje otorgado al administrador de puntaje.
# Cuando se inicie una ronda, suscríbete a los dispositivos de equipo, elige al azar a los agentes cazadores, activa el cronómetro de cazadores, coloca a los agentes de utilería y teletranspórtalos al área de juego. SetUpTeams()<suspends>:void = Logger.Print("Se están estableciendo los equipos.") # Suscríbete al cronómetro de puntaje del equipo utilería, establece el puntaje otorgado y suscríbete al evento eliminado de este equipo. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Ocurre cuando se elimina un agente de utilería. -
Luego, haz lo mismo con el equipo cazador. A continuación, establece el cronómetro de espera del equipo cazador conforme el retraso de aparición que desees para los cazadores.
# Cuando se inicie una ronda, suscríbete a los dispositivos de equipo, elige al azar a los agentes cazadores, activa el cronómetro de cazadores, coloca a los agentes de utilería y teletranspórtalos al área de juego. SetUpTeams()<suspends>:void = Logger.Print("Se están estableciendo los equipos.") # Suscríbete al cronómetro de puntaje del equipo utilería, establece el puntaje otorgado y suscríbete al evento eliminado de este equipo. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Ocurre cuando se elimina un agente de utilería. # Suscríbete al cronómetro de espera del equipo cazador y establece la duración. Además, suscríbete al evento de eliminación del equipo cazador. HunterTeam.WaitTimer.SuccessEvent.Subscribe(HuntersGo) HunterTeam.WaitTimer.SetMaxDuration(HunterTeam.SpawnDelay) HunterTeam.TeamManager.EnemyEliminatedEvent.Subscribe(OnHunterEliminated) # Ocurre cuando un agente cazador elimina a un agente de utilería. -
Todavía dentro de
SetupTeams(), inicializa las matrices iniciales de los agentes cazadores y de utilería. Luego, activa el HUD de espera mientras compruebas si hay suficientes jugadores para comenzar el juego. Si los hay, desactiva el HUD de espera.# Inicializa las matrices iniciales de los agentes cazadores y de utilería. Obtén los jugadores y averigua la cantidad de jugadores que hay en el servidor var StartingHunterAgents:[]agent = array{} var StartingPropAgents:[]agent = array{} var Players:[]player = GetPlayspace().GetPlayers() # Habilita el HUD adecuado para esperar a los jugadores. HUDControllerWaiting.Enable() # Comprueba si hay suficientes jugadores para comenzar la ronda. set Players = WaitingForMorePlayers.WaitForMinimumNumberOfPlayers(Players) Logger.Print("La ronda está iniciando.") # Desactiva el HUD en espera para utilizar el siguiente HUD de mayor prioridad. HUDControllerWaiting.Disable() -
Ahora que la ronda comenzó, es necesario controlar lo que sucede cuando un jugador se une o se quita de la partida. Aquí configurarás las suscripciones y definirás estas funciones más adelante.
# Ahora que la ronda comenzó, necesitamos controlar a los jugadores que se agregan o quitan de la partida. Suscríbete a esos eventos. GetPlayspace().PlayerAddedEvent().Subscribe(OnPlayerAdded) GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerRemoved) -
La cantidad de cazadores iniciales depende de la cantidad de jugadores de la partida. Para evitar que un cazador tenga que enfrentarse a diez jugadores, se creará una función que establezca la cantidad de cazadores en función de una fórmula. Convierte la cantidad de jugadores en un valor float para utilizarlo en la fórmula.
# Calcula la cantidad de agentes cazadores iniciales para la partida en función del recuento de jugadores y de la cantidad de agentes cazadores por cada jugador. NumberOfPlayers:float = 1.0 * Players.Length # Convierte Players.Length en un valor float para poder usarlo en la siguiente función Ceil. -
Ahora define el número de cazadores iniciales al límite de la siguiente fórmula. A continuación, mezcla la matriz de todos los jugadores para que los cazadores iniciales se elijan al azar desde la lista de jugadores.
# Calcula la cantidad de agentes cazadores iniciales para la partida en función del recuento de jugadores y de la cantidad de agentes cazadores por cada jugador. NumberOfPlayers:float = 1.0 * Players.Length # Convierte Players.Length en un valor float para poder usarlo en la siguiente función Ceil. if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Mezcla los jugadores y, luego, divide la matriz para obtener los agentes cazadores iniciales. Los jugadores restantes son los agentes de utilería iniciales. var RandomizedPlayers:[]agent = Shuffle(Players) -
Divide la matriz aleatoria en un tamaño entre 0 y tu número de cazadores iniciales. Este será el equipo inicial de cazadores, así que establécelo como StartingHunterAgents. El resto de los jugadores serán el equipo inicial de utilería, así que establécelos como StartingPropAgents.
# Calcula la cantidad de agentes cazadores iniciales para la partida en función del recuento de jugadores y de la cantidad de agentes cazadores por cada jugador. NumberOfPlayers:float = 1.0 * Players.Length # Convierte Players.Length en un valor float para poder usarlo en la siguiente función Ceil. if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Mezcla los jugadores y, luego, divide la matriz para obtener los agentes cazadores iniciales. Los jugadores restantes son los agentes de utilería iniciales. var RandomizedPlayers:[]agent = Shuffle(Players) if (set StartingHunterAgents = RandomizedPlayers.Slice[0,NumberOfStartingHunters]) {} if (set StartingPropAgents = RandomizedPlayers.Slice[NumberOfStartingHunters,RandomizedPlayers.Length]) {} # Itera a través de los agentes cazadores iniciales y asígnalos al equipo cazador. Luego, inicia el cronómetro de espera de los cazadores. Logger.Print("Agentes cazadores establecidos: {StartingHunterAgents.Length}.") for (StartingHunterAgent : StartingHunterAgents): HunterTeam.InitializeAgent(StartingHunterAgent) HunterTeam.WaitTimer.Start() # Itera a través de los agentes de utilería iniciales y asígnalos al equipo utilería. Teletranspórtalos al área de juego. Logger.Print("Agentes de utilería establecidos: {StartingPropAgents.Length}.") -
Una vez formados los equipos, activa el teletransportador de la sala para sacar la utilería de la sala inicial y activa su HeartBeat. Luego, desactiva el teletransportador de la sala de espera, ya que no lo necesitarás después de esto. Por último, establece la cantidad de utilería restante en el PropsRemainingTracker según el tamaño del equipo utilería.
LobbyTeleporter.Enable() for (StartingPropAgent : StartingPropAgents): PropTeam.InitializeAgent(StartingPropAgent) PropTeam.HeartBeat.SetUpUI(StartingPropAgent) LobbyTeleporter.Activate(StartingPropAgent) LobbyTeleporter.Disable() # Establece el objetivo y el valor del rastreador de utilería restante según la cantidad actual de utilería. # En el futuro, solo actualizaremos el valor a medida que se elimine la utilería. PropTeam.PropsRemainingTracker.SetTarget(PropTeam.Count()) PropTeam.UpdatePropsRemainingTracker()
Cómo gestionar las eliminaciones de jugadores
Los cazadores ganan eliminando toda la utilería y convirtiéndola en cazadores. Sigue estos pasos para otorgar un puntaje a los cazadores cuando eliminan utilería y para transferir la utilería eliminada al equipo de cazadores.
-
Crea una función llamada OnHunterEliminated(). Ya suscribiste el dispositivo administrador de equipos de cazadores EnemyEliminatedEvent a esto, por lo que se activará cada vez que un cazador elimine utilería.
# Cuando un agente cazador elimine a un agente de utilería, otorga puntaje. El puntaje se divide por la cantidad de agentes de utilería restantes. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("Un agente cazador ha eliminado a un agente de utilería.") -
Primero, tienes que otorgar a los cazadores un puntaje correspondiente a la cantidad de agentes de utilería restantes. Crea una variable
EliminationAwardigual alMaxEliminationScoredivido por elPropTeamSize. Configura el administrador de puntaje del equipo cazador a ese puntaje. Luego, recompensa al cazador que logró la eliminación.# Cuando un agente cazador elimine a un agente de utilería, otorga puntaje. El puntaje se divide por la cantidad de agentes de utilería restantes. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("Un agente cazador ha eliminado a un agente de utilería.") PropTeamSize := PropTeam.Count() if (EliminationAward := Floor(HunterTeam.MaxEliminationScore / PropTeamSize)): Logger.Print("Puntos otorgados: {EliminationAward}.") HunterTeam.ScoreManager.SetScoreAward(EliminationAward) HunterTeam.ScoreManager.Activate(HunterAgent) -
También es necesario que controles lo que ocurre con el equipo utilería cuando se elimina utilería. Crea una función llamada OnPropEliminated(). Al igual que OnHunterEliminated(), antes te suscribiste a esta función. Cuando se elimina utilería, debes eliminarla del equipo utilería mediante la función EliminateAgent() del PropTeam y, luego, inicializarla como cazador con la función InitializeAgent() del HunterTeam.
# Cuando se elimina un agente de utilería, debes quitar la utilería de su equipo, comprobar el fin de la ronda y establecerla como cazador. OnPropEliminated(PropAgent:agent):void = Logger.Print("Agente de utilería eliminado.") spawn{ PropTeam.EliminateAgent(PropAgent) } HunterTeam.InitializeAgent(PropAgent)
Cómo gestionar la entrada y la salida de jugadores
Cuando un jugador se une a la partida a mitad de la ronda, debes conseguir que aparezca como cazador.
-
Crea una función OnPlayerAdded() para controlar esto. Esta función solo inicializa al jugador que se une como cazador.
# Cuando un jugador se une a la partida a mitad de la ronda, conviértelo en cazador. OnPlayerAdded(Player:player):void = Logger.Print("Un jugador se ha unido a la partida.") HunterTeam.InitializeAgent(Player) -
Que los jugadores abandonen la partida es un poco más complicado. Si un jugador abandona la partida, tenemos que quitarlo del equipo en el que está y también comprobar si su abandono provoca el fin de la partida. Esto puede deberse a que el jugador que abandona era la última utilería o el único cazador. De esta lógica se encargan las funciones EliminateAgent() de cada equipo, por lo que generarás una instancia de ellas en función del equipo al que pertenezca el jugador que se elimina.
# Cuando un jugador abandone la partida, comprueba en qué equipo estaba y si finaliza la ronda. OnPlayerRemoved(Player:player):void= Logger.Print("Un jugador ha dejado la partida.") if (PropTeam.FindOnTeam[Player]): Logger.Print("El jugador era una utilería.") spawn{ PropTeam.EliminateAgent(Player) } if (HunterTeam.FindOnTeam[Player]): Logger.Print("El jugador era un cazador.") spawn{ HunterTeam.EliminateAgent(Player) }
Fin de la ronda
Una vez formados todos los equipos, debes monitorear el tamaño de cada uno de ellos para comprobar el fin de la ronda. El juego termina cuando uno de los dos equipos se vacía o cuando se acaba el tiempo de la ronda, por lo que se utilizará una expresión de carrera para ver cuál queda primero.
-
Al final de la función OnBegin(), en una expresión de carrera, Await() el TeamEmptyEvent del equipo de cazadores y de utilería y la función AwaitEnd() del RoundTimer. Una vez finalizada la carrera, activa la función EndRound() que definirás en el siguiente paso.
# Cuando no haya más agentes de utilería o cazadores (lo que ocurra primero) o cuando la ronda o el cronómetro de esta finalice. race: PropTeam.TeamEmptyEvent.Await() HunterTeam.TeamEmptyEvent.Await() RoundTimer.AwaitEnd() Logger.Print("La ronda está finalizando.") EndRound() -
En la función EndRound(), tienes que desactivar el sensor de latidos de cada jugador del equipo utilería y activar EndRound() en el dispositivo de RoundSettings. Debido a que la función EndRound() en el dispositivo de RoundSettings requiere que se transfiera un jugador, obtén el primer jugador en la matriz Players y transfiérelo como el instigador.
# Borra el VFX de latido y luego finaliza la ronda. EndRound():void= PropTeam.HeartBeat.DisableAll() # Obtén cualquier jugador para transferirlo a EndRound Players:[]player = GetPlayspace().GetPlayers() if (RoundEndInstigator := Players[0]): Logger.Print("Ronda finalizada.") RoundSettings.EndRound(RoundEndInstigator)