Comprendere l'algoritmo
All'inizio di una nuova partita, i team devono essere bilanciati presentando il giusto numero di giocatori.
A differenza dei giochi in cui il bilanciamento dei giocatori è simmetrico e i giocatori sono distribuiti equamente tra due team, il bilanciamento asimmetrico prevede che ogni team includa un numero relativo di giocatori. In altre parole, le dimensioni dei team devono rispettare un rapporto relativo.
Ad esempio, potresti sempre volere che un team abbia il doppio dei giocatori rispetto a un altro. Man mano che i giocatori si aggiungono alla partita, devi bilanciarli in modo da mantenere questo numero relativo. Nelle modalità di gioco in cui un team è più forte o ha abilità diverse dall'altro, il bilanciamento asimmetrico crea un'esperienza di gioco più fluida distribuendo attentamente il numero di giocatori in ogni team.
In questo esempio, devi fare in modo che i team con un numero massimo di giocatori più elevato (in questo caso, i Difensori) abbiano sempre più giocatori rispetto ai team con un numero massimo inferiore (come gli Infiltrati).
Per distribuire correttamente i giocatori, dovrai aggiungere ogni giocatore al team con la maggiore differenza rispetto al suo numero massimo di giocatori.
A tal fine, per ogni nuovo giocatore, dovrai controllare ogni team e memorizzare un riferimento al numero massimo e attuale di giocatori in quel team, oltre al team a cui assegnare il giocatore. Puoi sottrarre il numero massimo di giocatori dal numero attuale per ottenere la differenza dal massimo. Il team con la differenza maggiore rispetto al massimo rappresenta quello logico a cui assegnare il giocatore.
Scorrendo ogni team, ti assicuri di trovare quello con la differenza maggiore.
Definire l'algoritmo
Questo passaggio ti illustra come bilanciare le squadre di giocatori in modo asimmetrico all'inizio della partita.
- Aggiungi un nuovo metodo denominato
BalanceTeams()
alla classetriad_infiltration_game
. Questo metodo assegna un giocatore al team con la maggiore differenza rispetto al numero massimo di giocatori.# Bilancia equamente i giocatori di tutti i team presenti nel gioco BalanceTeams():void= Logger.Print("Avvio del bilanciamento dei team")
- Ottieni tutti i giocatori presenti nel gioco e memorizzali in un array variabile
AllPlayers
. Poi, avvia il riordino casuale diAllPlayers
. In questo modo i giocatori saranno assegnati ai team in modo casuale e non in base all'ordine in cui si sono uniti inizialmente alla partita.# 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)
- Ora non ti resta che iterare su tutti i giocatori e assegnarli al team con la maggiore differenza rispetto al numero massimo di giocatori. Lo farai attraverso una funzione di aiuto che creerai nel prossimo passaggio chiamata
FindTeamWithLargestDifference()
, ma prima inizializza una variabile opzione chiamataTeamToAssign
a cui assegnare un giocatore e impostala sul valore restituito daFindTeamWithLargestDifference()
.for(TeamPlayer:AllPlayers): var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference()
- Crea la funzione
FindTeamWithLargestDifference()
nella definizione della classetriad_infiltration_game
. Questa funzione trova il team con la maggiore differenza tra il numero di giocatori e il suo massimo e può restituire unteam
opzionale. Per evitare che un giocatore venga riassegnato quando è già parte di un team con la differenza maggiore, ilteam
restituito deve essere un'opzione.# Trova il team con la maggior differenza nel rispettivo numero di giocatori rispetto a # numero massimo di giocatori FindTeamWithLargestDifference():?team = Logger.Print("Tentativo di trovare il team meno numeroso")
- Inizializza una variabile team opzionale chiamata
TeamToAssign
che memorizzerà un riferimento al team con la maggiore differenza di giocatori e un numero interoLargestDifference
per tenere traccia della differenza di giocatori.# Trova il team con la maggior differenza nel rispettivo numero di giocatori rispetto a # numero massimo di giocatori. FindTeamWithLargestDifference():?team = Logger.Print("Tentativo di trovare il team meno numeroso") var TeamToAssign:?team = false var LargestDifference:int = 0
- Ora iteriamo sull'elenco dei team, ottenendo sia la dimensione attuale che la dimensione massima del team.
var TeamToAssign:?team = false var LargestDifference:int = 0 for: CandidateTeam:Teams CurrentTeamSize := GetPlayspace().GetTeamCollection().GetAgents[CandidateTeam].Length MaximumTeamSize := TeamsAndTotals[CandidateTeam]
- Per ogni team, calcola la
DifferenceFromMaximum
, che è la differenza tra la dimensione massima di questo team e il numero di giocatori che contiene attualmente. Se il team presenta una differenza maggiore diLargestDifference
, impostaLargestDifference
suDifferenceFromMaximum
e inserisciTeamToAssign
in un'option
.for: CandidateTeam:Teams CurrentTeamSize := GetPlayspace().GetTeamCollection().GetAgents[CandidateTeam].Length MaximumTeamSize := TeamsAndTotals[CandidateTeam] do: Logger.Print("Controllo del team in corso...") Logger.Print("Le dimensioni massime di questo team sono {MaximumTeamSize}") DifferenceFromMaximum := MaximumTeamSize - CurrentTeamSize Logger.Print("La differenza dal valore massimo è {DifferenceFromMaximum}") if(LargestDifference < DifferenceFromMaximum): set LargestDifference = DifferenceFromMaximum set TeamToAssign = option{CandidateTeam} Logger.Print("Trovato un team con un numero di giocatori inferiore al massimo: {DifferenceFromMaximum}")
- Infine, restituisci
TeamToAssign
. Il tuo codiceFindTeamWithLargestDifference()
dovrebbe essere simile al seguente:# Trova il team con la maggior differenza nel rispettivo numero di giocatori rispetto a # numero massimo di giocatori. FindTeamWithLargestDifference():?team = Logger.Print("Tentativo di trovare il team meno numeroso") var TeamToAssign:?team = false var LargestDifference:int = 0 for: CandidateTeam:Teams CurrentTeamSize := GetPlayspace().GetTeamCollection().GetAgents[CandidateTeam].Length MaximumTeamSize := TeamsAndTotals[CandidateTeam] do: Logger.Print("Controllo del team in corso...") Logger.Print("Le dimensioni massime di questo team sono {CandidateTeamIndex + 1}, ovvero {MaximumTeamSize}") DifferenceFromMaximum := MaximumTeamSize - CurrentTeamSize Logger.Print("La differenza dal valore minimo è {DifferenceFromMaximum}") if(LargestDifference < DifferenceFromMaximum): set LargestDifference = DifferenceFromMaximum set TeamToAssign = option{CandidateTeam} Logger.Print("Trovato un team con un numero di giocatori inferiore al minimo: {DifferenceFromMaximum}") return TeamToAssign
- In
BalanceTeams()
, assegna il giocatore a un nuovo team utilizzando la funzioneFortTeamCollection.AddToTeam[]
. Se l'assegnazione non riesce, significa che il giocatore apparteneva già al team meno numeroso.var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, FortTeamCollection.AddToTeam[TeamPlayer, AssignedTeam]): Logger.Print("Tentativo di assegnare il giocatore a un nuovo team")
- La tua funzione
BalanceTeams()
dovrebbe essere simile alla 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): var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, FortTeamCollection.AddToTeam[TeamPlayer, AssignedTeam]): Logger.Print("Giocatore assegnato a un nuovo team")
Teletrasporto dei giocatori nelle rispettive aree di generazione
Anche se i giocatori finiscono nel team con la differenza maggiore, potrebbero non generarsi nella zona corretta. Ciò avviene perché i giocatori si generano prima di essere bilanciati in un nuovo team. Per gestire questo problema, dovrai creare una nuova funzione per teletrasportare i giocatori nella loro zona di generazione dopo il bilanciamento dei team.
- Crea la funzione
TeleportPlayersToStartLocations()
nella definizione della classetriad_infiltration_game
. Questa funzione teletrasporta i giocatori nella zona di generazione prevista per il loro team una volta terminato il bilanciamento dei team.# Teletrasporta i giocatori nella zona di generazione prevista per il loro team una volta terminato il bilanciamento dei team. TeleportPlayersToStartLocations():void= Logger.Print("Teletrasporto dei giocatori alle posizioni di partenza")
- In un loop
for
, scorri l'arrayTeams
, ottenendo l'indice di quel team e memorizzandolo in una variabileTeamIndex
.# Teletrasporta i giocatori nella zona di generazione prevista per il loro team una volta terminato il bilanciamento dei team. TeleportPlayersToStartLocations():void= Logger.Print("Teletrasporto dei giocatori alle posizioni di partenza") for: TeamIndex -> PlayerTeam:Teams
- Ottieni i giocatori per
PlayerTeam
chiamandoGetAgents[]
utilizzandoPlayerTeam
. Quindi ottieni il teletrasporto associato a quel team indicizzando l'arrayTeleporters
conTeamIndex
e memorizzandolo in una variabileTeamTeleporter
. Memorizza la trasformazione di quel teletrasporto in una variabileTransform.
# Teletrasporta i giocatori nella zona di generazione prevista per il loro team una volta terminato il bilanciamento dei team. TeleportPlayersToStartLocations():void= Logger.Print("Teletrasporto dei giocatori alle posizioni di partenza") for: TeamIndex -> PlayerTeam:Teams TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[PlayerTeam] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform()
Assicurati che l'ordine dei tuoi team in
Teams
corrisponda all'ordine dei tuoi teletrasporti inTeleporters
. Se gli Infiltrati appartengono al Team 1, di conseguenza il primo teletrasporto inTeleporters
sarà previsto per gli Infiltrati. Controlla nell'editor che i valori siano corretti. - Ora, in un secondo loop
for
, itera su ogni giocatore inTeamPlayers
e fallo rigenerare quando il teletrasporto si trasforma utilizzandoRespawn()
e la traslazione e la rotazione diTransform
. La tua funzioneTeleportPlayersToStartLocations()
deve essere simile alla seguente:# Teletrasporta i giocatori nella zona di generazione prevista per il loro team una volta terminato il bilanciamento dei team. TeleportPlayersToStartLocations():void= Logger.Print("Teletrasporto dei giocatori alle posizioni di partenza") 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("Il giocatore è stato teletrasportato nella sua posizione iniziale")
- In
OnBegin()
, aggiungi una chiamata aBalanceTeams()
dopo aver rimescolatoAllPlayers
. In questo modo i giocatori saranno bilanciati in ordine casuale e non sempre nello stesso team. Quindi teletrasporta i giocatori nelle loro posizioni di partenza chiamandoTeleportPlayersToStartLocations()
.OnBegin<override>()<suspends> : void = # Ottieni tutti i team set Teams = GetPlayspace().GetTeamCollection().GetTeams() # Salva i team per farvi riferimento in seguito set MaybeInfiltrators = option{Teams[0]} set MaybeAttackers = option{Teams[1]} set MaybeDefenders = option{Teams[2]} if: Infiltrators := MaybeInfiltrators? Attackers := MaybeAttackers? Defenders := MaybeDefenders? Logger.Print("Sono stati trovati tutti e tre i team") set TeamsAndTotals[Infiltrators] = MaximumInfiltrators set TeamsAndTotals[Attackers] = MaximumAttackers set TeamsAndTotals[Defenders] = MaximumDefenders Logger.Print("Configura tutti e tre i team in TeamsAndTotals") then: BalanceTeams() TeleportPlayersToStartLocations() else: Logger.Print("Impossibile trovare tutti i team: assicurati di assegnare i team corretti nelle impostazioni della tua isola.")
-
Salva lo script, compilalo e fai clic su Avvia sessione nella barra degli strumenti UEFN per eseguire il playtest del livello. Durante il playtest del livello, ogni giocatore dovrebbe essere assegnato al team con la differenza maggiore ed essere nell'area di generazione del suo team. Verifica questo comportamento utilizzando il registro. Puoi regolare il numero massimo di giocatori per team nella tua classe
triad_infiltration_game
per testare questa funzionalità quando hai meno giocatori rispetto al numero massimo previsto. Ad esempio, quando esegui un test individuale, prova a impostare il numero massimo di giocatori nel team a cui stai cercando di unirti a un valore più alto rispetto agli altri due team. Se vuoi unirti agli Attaccanti, aumenta il valore diMaximumAttackers
. Se invece vuoi unirti agli Infiltrati, aumenta quello diMaximumInfiltrators
.
Passaggio successivo
Nel passaggio successivo di questo tutorial, imparerai come assegnare le armi ai giocatori quando vengono generati all'inizio di un gioco.