Utilizzerai una mappa per monitorare il numero di eliminazioni segnate da un giocatore. Le mappe forniscono una comoda associazione delle chiavi ai valori e in questo tutorial, userai il giocatore come chiave e il suo livello di arma associato (rappresentato come un int) come valore. In questo modo, puoi recuperare il livello attuale di un giocatore con un semplice riferimento al giocatore stesso. Di seguito è riportato un esempio di come potrebbe venire visualizzata una mappa delle associazioni di livello tra giocatori e armi.
Chiave | giocatore 1 | giocatore 2 | giocatore 3 |
Valore | 1 | 2 | 2 |
Arma nel gioco | Pistola da combattimento L1 | Pistola a focile L1 | Pistola a focile L1 |
Per impostare e popolare la tua mappa dei giocatori, attieniti ai passaggi seguenti:
-
Aggiungi la mappa
[player]int
denominataPlayerMap
alla classeteam_elimination_game
. In tal modo, si memorizza un riferimento a ciascun giocatore e al relativo livello di arma.team_elimination_game := class(creative_device): var PlayerMap : [player]int = map{}
-
Aggiungi un nuovo metodo
PopulateTeamsAndPlayers()
alla classeteam_elimination_game
. Questo metodo popola la tuaPlayerMap
e sarà richiamato daOnBegin()
.PopulateTeamsAndPlayers() : void= Print("Avvio della popolazione dei giocatori")
-
Aggiungi un nuovo metodo
OnPlayerEliminated
alla classeteam_elimination_game
. Viene richiamato ogni volta che un giocatore viene eliminato e determina chi è il giocatore che lo ha eliminato accedendo alla strutturaelimination_result
, passata come argomento.OnPlayerEliminated(Result : elimination_result) : void= Print("Un giocatore è stato eliminato!")
-
Quando la partita inizia, devi scorrere l'elenco dei giocatori e impostarli tutti sul primo livello di arma. All'interno di
PopulateTeamsAndPlayers
, ottieni tutti i giocatori usandoGetPlaySpace().GetPlayers()
e salvali in un arrayAllPlayers
. Per ogni giocatore, recupera il relativoFortCharacter
e salvalo in una variabileFortCharacter
. Imposta il punteggio del giocatore nellaPlayerMap
su 0 per rappresentare la prima arma nell'arrayWeaponGranters
, quindi sottoscriviFortCharacter.EliminatedEvent()
aOnPlayerEliminated
.AllPlayers := GetPlayspace().GetPlayers() for (Agent : AllPlayers, TeamPlayer := player[Agent], FortCharacter := TeamPlayer.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Giocatore assegnato a PlayerMap con livello {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated)
-
Con un riferimento al punteggio del giocatore nell'insieme
PlayerMap
, puoi assegnare ai giocatori la loro prima arma. ModificaOnPlayerSpawn
per assegnare ai giocatori la loro prima arma. Quando un giocatore si genera, recupera il suo livello di arma daPlayerMap
e memorizzalo in una variabileWeaponTier
, quindi chiamaGrantWeapon
passandoWeaponTier
e un riferimento al giocatore.OnPlayerSpawn(InPlayer : agent) : void = Print("Un giocatore è stato appena generato!") if(WeaponTier := PlayerMap[InPlayer]): GrantWeapon(option{InPlayer}, WeaponTier) Print("Al giocatore generato è stata conferita una pistola di livello {WeaponTier}")
-
Salva lo script in Visual Studio Code, 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, dovresti far generare la prima arma nell'array
WeaponGranters
. Verifica questo comportamento con il registro.

Mappatura dei team di giocatori
Una volta impostata la mappa dei giocatori, è utile pensare a come controllare il punteggio di un giocatore. Poiché lo script promuoverà automaticamente il giocatore dl team con il minor numero di eliminazioni, non è utile controllare il livello di arma dei giocatori del team nemico. Potresti già notare un problema, dato che PlayerMap
non fa distinzione tra i diversi team.
Per ovviare a questo problema, è possibile utilizzare un'altra mappa. Per questa operazione, adatterai la PlayerMap
impostata in precedenza in un sistema di mappe annidate. Poiché le coppie chiave-valore in una mappa possono essere costituite da qualsiasi coppia di tipi, ha senso che una chiave di team possa avere un'altra mappa come valore. La prima mappa associa i team (chiave) a un'altra mappa dei giocatori di quel team (valore). La mappa interna associa i giocatori (chiave) al loro punteggio (valore).
Ora, in presenza di un giocatore, puoi verificare in quale team si trova utilizzando GetTeam()
. Da qui puoi recuperare un elenco di compagni di team con cui confrontare il numero di eliminazioni.
La sintassi della mappa annidata [team][giocatore]int potrebbe non essere chiara. Per facilitare la comprensione, puoi sfruttare l'aliasing tipo per creare un nome più semplice che faccia riferimento alla mappa. In questo tutorial darai al [giocatore]int l'alias di player_map. Questo significa che puoi utilizzare il nome player_map
ogni volta che ti occorre [player]int
, e la mappa annidata può essere riscritta come [team]player_map
, ovvero una mappa che associa i team alle mappe dei giocatori.
Per convertire la tua mappa in un sistema di mappe annidate, attieniti ai passaggi seguenti:
-
Sopra la definizione della classe
team_elimination_game
, aggiungi un alias per[player]int
denominatoplayer_map
.player_map := [player]int # Questo è un alias tipo! team_elimination_game := class(creative_device):
-
Sostituisci la variabile
PlayerMap
impostata in precedenza inteam_elimination_game
con una nuova variabileTeamMap
di tipo[team]player_map
.# Mappa di mappe del team, dove la chiave è il team e il valore è una mappa di # un giocatore->int key-value pairs var TeamMap : [team]player_map = map{}
-
Poiché il valore di
TeamMap
è di tipoplayer_map
, per ogni team devi inizializzare una mappa di giocatori, popolarla, impostare il punteggio di ogni giocatore su0
, quindi assegnare la mappa di giocatori aTeamMap
. ModificaPopulateTeamsAndPlayers()
con il codice aggiornato.- Per ogni team, recupera i giocatori corrispondenti e memorizzali in una variabile
TeamPlayers
. Inizializza una nuova variabilePlayerMap
di tipoplayer_map
per mappare i giocatori al loro punteggio.
PopulateTeamsAndPlayers() : void= Print("Avvio della popolazione dei giocatori") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {}
- Per ogni giocatore in
TeamPlayers
, recupera il relativoFortCharacter
e salvalo in una variabileFortCharacter
. Imposta il punteggio del giocatore nellaPlayerMap
su0
per rappresentare la prima arma nell'arrayWeaponGranters
, quindi sottoscriviFortCharacter.EliminatedEvent()
aOnPlayerEliminated
.
PopulateTeamsAndPlayers() : void = Print("Avvio della popolazione dei giocatori") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {} for (Agent : TeamPlayers, TeamPlayer := player[Agent], FortCharacter := Agent.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Giocatore assegnato a PlayerMap con livello {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated)
- Infine, imposta
PlayerMap
come valore della chiave attualeTeam
inTeamMap
. Il codicePopulateTeamsAndPlayers
dovrebbe essere simile a quanto riportato di seguito.
PopulateTeamsAndPlayers() : void = Print("Avvio della popolazione dei giocatori") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {} for (Agent : TeamPlayers, TeamPlayer := player[Agent], FortCharacter := Agent.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Giocatore assegnato a PlayerMap con livello {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated) if(set TeamMap[Team] = PlayerMap): Print("Questo team è stato impostato con successo nella TeamMap")
- Per ogni team, recupera i giocatori corrispondenti e memorizzali in una variabile
-
Una volta impostata la
TeamMap
, aggiornaOnPlayerSpawn
per accedere al team di un giocatore utilizzandoGetTeam[]
e memorizzala in una variabile localePlayerTeam
. ImpostaWeaponTier
recuperando il punteggio corrente del giocatore daTeamMap
, usando siaPlayerTeam
che un riferimento al giocatore. Il codice aggiornato diOnPlayerSpawn()
dovrebbe essere simile al seguente.OnPlayerSpawn(InPlayer : agent) : void = Print("Un giocatore è stato appena generato!") if: PlayerTeam := GetPlayspace().GetTeamCollection().GetTeam[InPlayer] WeaponTier:int := TeamMap[PlayerTeam][InPlayer] then: GrantWeapon(option{InPlayer}, WeaponTier) Print("Al giocatore generato è stata conferita una pistola di livello {WeaponTier}")
Salva lo script in Visual Studio Code, compilalo e fai clic su Avvia sessione nella barra degli strumenti UEFN per eseguire il playtest del livello. Quando esegui il playtest del livello, dovresti far generare di nuovo la prima arma nell'array WeaponGranters
. Verifica questo comportamento con il registro.

Passaggio successivo
Nel passaggio successivo di questo tutorial, imparerai ad assegnare le armi ai giocatori quando realizzano un'eliminazione.