Lorsqu'un nouveau joueur rejoint le jeu, les joueurs doivent être répartis de manière asymétrique dans l'équipe appropriée. Si cette équipe s'avère être celle des infiltrés, une instance d'OnInfiltratorDamaged() doit lui être associée.
Suivez les étapes ci-dessous pour apprendre à répartir les joueurs dans la bonne équipe lorsqu'ils rejoignent une partie en cours.
Configurer les fonctions d'intégration de partie en cours
- Ajouter une nouvelle fonction,
OnInfiltratorJoined(), à la définition de classeinvisibility_manager. Cette fonction prend un agent et génère une instance deOnInfiltratorDamaged()avec l'agent donné. Ajoutez le spécificateur<public>à cette fonction, puisque vous l'appellerez depuistriad_infiltration_game.# Génère une fonction OnInfiltratorDamaged lorsqu'un nouvel infiltré rejoint la partie OnInfiltratorJoined<public>(InAgent:agent):void= spawn{OnInfiltratorDamaged(InAgent)} - Ajouter une nouvelle fonction
OnPlayerAdded()à la définition de classetriad_infiltration_game. Cette fonction prend un joueur, l'assigne à l'équipe appropriée et appelleOnInfiltratorJoined()si le nouveau joueur est un infiltré.# Gère l'arrivée d'un nouveau joueur dans la partie. OnPlayerAdded(InPlayer:player):void= - Récupérez la collection
fort_team_collectionde l'espace de jeu actuel et enregistrez-la dans une variableFortTeamCollection.# Gère l'arrivée d'un nouveau joueur dans la partie. OnPlayerAdded(InPlayer:player):void= Logger.Print("A new Player joined, assigning them to a team") FortTeamCollection := GetPlayspace().GetTeamCollection()Refactorisation de l'équilibrage de l'équipe
- Vous devez assigner le nouveau joueur à l'équipe appropriée, mais si vous appelez
BalanceTeams(), vous allez finir par réassocier chaque joueur à une nouvelle équipe. Au lieu de réécrire le code pour trouver l'équipe la plus petite pour le nouveau joueur et l'y assigner, la refactorisation est un bon choix. 1. Ajoutez une nouvelle méthodeBalancePlayer()à la définition de classetriad_infiltration_game. Cette méthode prend un joueur et l'assigne de manière asymétrique à la bonne équipe.# Pour chaque joueur, itérer sur la liste des équipes et l'assigner à # l'équipe ayant le moins de joueurs ou son équipe de départ en cas d'égalité. BalancePlayer(InPlayer:player):void= Logger.Print("Beginning to balance player")- Extrayez le code à l'intérieur de la boucle
fordansBalanceTeams()et placez-le à l'intérieur deBalancePlayer(), en renommantTeamPlayerenInPlayer. Votre codeBalancePlayer()doit être similaire à celui-ci :# Pour chaque joueur, itérer sur la liste des équipes et l'assigner à # l'équipe ayant le moins de joueurs ou son équipe de départ en cas d'égalité. BalancePlayer(InPlayer:player):void= Logger.Print("Beginning to balance player") var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, GetPlayspace().GetTeamCollection().AddToTeam[InPlayer, AssignedTeam]): Logger.Print("Attempting to assign newly joined to a new team") else: Logger.Print("This player was already on the smallest team")1. Maintenant, dans
BalanceTeams(), ajoutez un appel àBalancePlayer()dans la bouclefor. Cela préserve la fonctionnalité deBalanceTeams()tout en vous permettant d'assigner individuellement les joueurs à des équipes. Votre codeBalanceTeams()devrait être similaire à 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): BalancePlayer(TeamPlayer)
- Extrayez le code à l'intérieur de la boucle
- De retour dans
OnPlayerAdded(), ajoutez un appel àBalancePlayer()en passant le joueur qui vient de rejoindre la partie.# Gère l'arrivée d'un nouveau joueur dans la partie. OnPlayerAdded(InPlayer:player):void= Logger.Print("A new Player joined, assigning them to a team") FortTeamCollection := GetPlayspace().GetTeamCollection() set AllPlayers = GetPlayspace().GetPlayers() # Affecter le nouveau joueur à l'équipe la plus petite BalancePlayer(InPlayer) - Recherchez l'index de l'équipe du joueur après équilibrage en itérant chaque équipe de la matrice
Teams, en utilisantGetTeam[]comme filtre pour vous assurer qu'elle correspond àPlayerTeam.# Gère l'arrivée d'un nouveau joueur dans la partie. OnPlayerAdded(InPlayer:player):void= Logger.Print("A new Player joined, assigning them to a team") FortTeamCollection := GetPlayspace().GetTeamCollection() # Affecter le nouveau joueur à la plus petite équipe, de manière asymétrique. BalancePlayer(InPlayer) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] - Obtenez le téléporteur associé à l'équipe du joueur en l'indexant dans la matrice
Teleportersà l'aide deTeamIndexet en le stockant dans une variableTeamTeleporter. Stockez la transformation de ce téléporteur dans une variableTransform. Faites ensuite apparaître le nouveau joueur sur le téléporteur de départ de son équipe.for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Teleported the spawned player to their start location")1. Enfin, vérifiez si le joueur qui vient de rejoindre la partie est un infiltré en comparant son équipe à l'option
Infiltratorsque vous avez configuré précédemment. Si c'est le cas, appelezOnInfiltratorJoined()depuis la classeinvisibility_managersur le nouveau joueur pour l'autoriser à commencer à scintiller. Votre codeOnPlayerAdded()devrait être similaire à ce qui suit :# Gère l'arrivée d'un nouveau joueur dans la partie. OnPlayerAdded(InPlayer:player):void= Logger.Print("A new Player joined, assigning them to a team") FortTeamCollection := GetPlayspace().GetTeamCollection() # Affecter le nouveau joueur à la plus petite équipe, de manière asymétrique. 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("Teleported the spawned player to their start location") # Si le joueur était un infiltré, appeler OnInfiltratorJoined dans # InvisibilityManager. if(PlayerTeam = MaybeInfiltrators?): InvisibilityManager.OnInfiltratorJoined(InPlayer) - 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, les joueurs doivent rejoindre l'équipe appropriée s'ils rejoignent une partie en cours. Si ce joueur est un infiltré, il doit apparaître à l'état invisible et scintiller lorsqu'il subit des dégâts.
Étape suivante
Dans l'étape suivante de ce tutoriel, vous apprendrez à créer un indicateur visuel de joueur venant de capturer un objectif.