Quando un nuovo giocatore si unisce a una partita in corso, deve essere assegnato al team giusto in modo che i team siano bilanciati in modo equilibrato. Se questo team risulta essere quello degli Infiltrati, deve anche avere un'istanza di OnInfiltratorDamaged() associata.
Segui i passaggi seguenti per imparare come assegnare i giocatori al team corretto in modo bilanciato quando si uniscono a una partita in corso.
Configurare le funzioni di partecipazione dei giocatori
- Aggiungi una nuova funzione
OnInfiltratorJoined()alla definizione della classeinvisibility_manager. Questa funzione prende un agente e genera un'istanza diOnInfiltratorDamaged()con l'agente indicato. Aggiungi lo specificatore `` a questa funzione per poterla chiamare da triad_infiltration_game.# Genera una funzione OnInfiltratorDamaged quando un nuovo infiltrato si unisce al gioco OnInfiltratorJoined<public>(InAgent:agent):void= spawn{OnInfiltratorDamaged(InAgent)} - Aggiungi una nuova funzione
OnPlayerAdded()alla definizione della classetriad_infiltration_game. Questa funzione prende un giocatore, lo assegna alla squadra appropriata e chiamaOnInfiltratorJoined()se il nuovo giocatore è un Infiltrato.# Gestisce un nuovo giocatore che si unisce al gioco. OnPlayerAdded(InPlayer:player):void= - Ottieni
fort_team_collectionper lo spazio di gioco attuale e memorizzala in una variabileFortTeamCollection.# Gestisce un nuovo giocatore che si unisce al gioco. OnPlayerAdded(InPlayer:player):void= Logger.Print("Si è unito un nuovo giocatore, assegnazione a un team in corso") FortTeamCollection := GetPlayspace().GetTeamCollection()Bilanciamento dei team tramite refactoring
- Devi assegnare il nuovo giocatore al team corretto: tuttavia se chiami
BalanceTeams()finirai per redistribuire tutti i giocatori in un nuovo team. Invece di riscrivere il codice per trovare il team meno numeroso per il nuovo giocatore, ti consigliamo di optare per una strategia di refactoring.- Aggiungi un nuovo Metodo
BalancePlayer()alla definizione della classetriad_infiltration_game. Questo metodo prende un giocatore e lo bilancia in modo asimmetrico all'interno del team corretto.# Per ogni giocatore, scorri l'elenco dei team e assegnalo al # team con il minor numero di giocatori o il team iniziale in caso di parità. BalancePlayer(InPlayer:player):void= Logger.Print("Avvio del bilanciamento dei giocatori") - Estrai il codice all'interno del loop
fordiBalanceTeams()e inseriscilo all'interno diBalancePlayer(), rinominandoTeamPlayerinInPlayer. Il codiceBalancePlayer()dovrebbe essere simile al seguente:# Per ogni giocatore, scorri l'elenco dei team e assegnalo al # team con il minor numero di giocatori o il team iniziale in caso di parità. BalancePlayer(InPlayer:player):void= Logger.Print("Avvio del bilanciamento dei giocatori") var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, GetPlayspace().GetTeamCollection().AddToTeam[InPlayer, AssignedTeam]): Logger.Print("Tentativo di assegnare il nuovo giocatore a un nuovo team") else: Logger.Print("Il giocatore era già membro del team meno numeroso") - Ora in
BalanceTeams(), aggiungi una chiamata aBalancePlayer()all'interno del loopfor. Ciò conserva la funzionalità diBalanceTeams()e permette di bilanciare un giocatore individualmente. Il codiceBalanceTeams()dovrebbe essere simile al seguente:# Bilancia equamente i giocatori di tutti i team presenti nel gioco BalanceTeams():void= Logger.Print("Avvio del bilanciamento dei team") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) Logger.Print("La lunghezza di AllPlayers è {AllPlayers.Length}") for(TeamPlayer:AllPlayers): BalancePlayer(TeamPlayer)
- Aggiungi un nuovo Metodo
- Torna in
OnPlayerAdded(), aggiungi una chiamata aBalancePlayer()passando il giocatore che si è appena unito.# Gestisce un nuovo giocatore che si unisce al gioco. OnPlayerAdded(InPlayer:player):void= Logger.Print("Si è unito un nuovo giocatore, assegnazione a un team in corso") FortTeamCollection := GetPlayspace().GetTeamCollection() set AllPlayers = GetPlayspace().GetPlayers() # Assegna il nuovo giocatore al team meno numeroso BalancePlayer(InPlayer) - Trova l'indice del team del giocatore dopo il bilanciamento scorrendo ogni team nell'array
Teams, utilizzandoGetTeam[]come un filtro per controllare che corrisponda aPlayerTeam.# Gestisce un nuovo giocatore che si unisce al gioco. OnPlayerAdded(InPlayer:player):void= Logger.Print("Si è unito un nuovo giocatore, assegnazione a un team in corso") FortTeamCollection := GetPlayspace().GetTeamCollection() # Assegna il nuovo giocatore al team meno numeroso in modo asimmetrico. BalancePlayer(InPlayer) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] - Ottieni il teletrasporto associato al team del giocatore indicizzando l'array
TeleportersconTeamIndexe memorizzandolo in una variabileTeamTeleporter. Memorizza la trasformazione di quel teletrasporto in una variabileTransform. Quindi, rigenera il nuovo giocatore nel teletrasporto iniziale del suo team.for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Il giocatore generato è stato teletrasportato nella sua posizione iniziale") - Infine, verifica se il giocatore appena che si è appena unito è un Infiltrato confrontando il suo team con l'opzione
Infiltratorsimpostata in precedenza. Se risulta essere un Infiltrato, chiamaOnInfiltratorJoined()dalla classeinvisibility_managersul nuovo giocatore per applicargli un effetto di sfarfallio. Il codiceOnPlayerAdded()dovrebbe essere simile a seguente:# Gestisce un nuovo giocatore che si unisce al gioco. OnPlayerAdded(InPlayer:player):void= Logger.Print("Si è unito un nuovo giocatore, assegnazione a un team in corso") FortTeamCollection := GetPlayspace().GetTeamCollection() # Assegna il nuovo giocatore al team meno numeroso in modo asimmetrico. 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("Il giocatore generato è stato teletrasportato nella sua posizione iniziale") # Se il giocatore era un infiltrato, chiama OnInfiltratorJoined in # InvisibilityManager. if(PlayerTeam = MaybeInfiltrators?): InvisibilityManager.OnInfiltratorJoined(InPlayer) - Salva lo script, compilalo e fai clic su Avvia sessione nella barra degli strumenti UEFN per eseguire il playtest del livello. Quando esegui il playtest del tuo livello, i giocatori che si uniscono a una partita in corso dovrebbero ora unirsi al team corretto. Se il nuovo giocatore è un Infiltrato, dovrebbe generarsi invisibile ed essere soggetto a un effetto di sfarfallio quando subisce danni.
Passaggio successivo
Nel passaggio successivo di questo tutorial, imparerai come creare un indicatore visivo per un giocatore quando cattura un obiettivo.