Impostazione dei team
In questa sezione imparerai a preparare i team cacciatori e il team oggetti scenografici all'inizio della partita e a teletrasportarli nelle loro aree di partenza.
Questa pagina include snippet di Verse che mostrano come eseguire le meccaniche di gameplay necessarie in questo gameplay. Segui i passaggi seguenti e copia lo script completo al passaggio 6 di questo tutorial.
Segui questi passaggi per impostare correttamente i tuoi team:
-
Crea una nuova funzione SetupTeams(). Qui imposterai più iscrizioni a funzioni che definirai in seguito, come ad esempio le funzioni per quando un oggetto scenografico viene eliminato o come procedere quando un giocatore si unisce alla partita.
# Quando inizia un round, iscriviti ai dispositivi del team, scegli casualmente gli agenti cacciatori, attiva il timer dei cacciatori, imposta gli agenti oggetti scenografici e teletrasportali nell'area di gioco. SetUpTeams()<suspends>:void = Logger.Print("Creazione dei team.")
-
Per prima cosa iscriviti all'evento SuccessEvent del timer del punteggio del team oggetti scenografici, all'Evento di eliminazione del TeamManager del team oggetti scenografici e imposta il punteggio assegnato a Gestione punteggio.
# Quando inizia un round, iscriviti ai dispositivi del team, scegli casualmente gli agenti cacciatori, attiva il timer dei cacciatori, imposta gli agenti oggetti scenografici e teletrasportali nell'area di gioco. SetUpTeams()<suspends>:void = Logger.Print("Creazione dei team.") # Iscriviti al timer del punteggio del team oggetti scenografici, imposta il premio per il punteggio e iscriviti all'evento di eliminazione del team oggetti scenografici. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Si verifica quando un agente oggetto scenografico viene eliminato.
-
Poi, fai lo stesso per il team cacciatori. Quindi imposta il timer di attesa del team cacciatori sul ritardo di generazione che desideri per i cacciatori.
# Quando inizia un round, iscriviti ai dispositivi del team, scegli casualmente gli agenti cacciatori, attiva il timer dei cacciatori, imposta gli agenti oggetti scenografici e teletrasportali nell'area di gioco. SetUpTeams()<suspends>:void = Logger.Print("Creazione dei team.") # Iscriviti al timer del punteggio del team oggetti scenografici, imposta il premio per il punteggio e iscriviti all'evento di eliminazione del team oggetti scenografici. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Si verifica quando un agente oggetto scenografico viene eliminato. # Iscriviti al timer di attesa del team cacciatori e imposta la durata. Inoltre, iscriviti all'evento di eliminazione del team cacciatori. HunterTeam.WaitTimer.SuccessEvent.Subscribe(HuntersGo) HunterTeam.WaitTimer.SetMaxDuration(HunterTeam.SpawnDelay) HunterTeam.TeamManager.EnemyEliminatedEvent.Subscribe(OnHunterEliminated) # Si verifica quando un agente cacciatore elimina un agente oggetto scenografico.
-
Sempre all'interno di
SetupTeams()
, inizializza gli array degli agenti cacciatori e degli agenti oggetti scenografici iniziali, quindi attiva l'HUD di attesa mentre verifichi se ci sono abbastanza giocatori per iniziare la partita. Se ci sono, disabilita l'HUD di attesa.# Inizializza gli array degli agenti cacciatori e degli agenti oggetti scenografici iniziali. Ottieni i giocatori e trova il numero di giocatori nel server var StartingHunterAgents:[]agent = array{} var StartingPropAgents:[]agent = array{} var Players:[]player = GetPlayspace().GetPlayers() # Abilita l'HUD appropriato per l'attesa dei giocatori. HUDControllerWaiting.Enable() # Controlla se ci sono abbastanza giocatori per iniziare il round. set Players = WaitingForMorePlayers.WaitForMinimumNumberOfPlayers(Players) Logger.Print("Round iniziato.") # Disabilita l'HUD di attesa per utilizzare l'HUD successivo con priorità più alta. HUDControllerWaiting.Disable()
-
Ora che il round è iniziato, devi gestire cosa succede quando un giocatore si unisce o viene rimosso dalla partita. Qui imposterai le iscrizioni e definirai queste funzioni in seguito.
# Ora che il round è iniziato, dobbiamo gestire i giocatori che vengono aggiunti o rimossi dalla partita. Iscriviti a quegli eventi. GetPlayspace().PlayerAddedEvent().Subscribe(OnPlayerAdded) GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerRemoved)
-
Il numero di cacciatori iniziali dipende dal numero di giocatori presenti nella tua partita. Non vuoi che un cacciatore debba occuparsi di dieci giocatori, quindi imposterai una funzione che stabilisce il numero di cacciatori in base a una formula. Converti il numero di giocatori in un float da utilizzare nella formula.
# Calcola il numero di agenti cacciatori iniziali della partita, in base al numero di giocatori e al numero di agenti cacciatori per numero di giocatori. NumberOfPlayers:float = 1.0 * Players.Length # Converte Players.Length in un float in modo che possa essere utilizzato nella successiva funzione Limite massimo.
-
Ora imposta il numero di cacciatori iniziali al massimo della formula seguente. Poi rimescola l'array di tutti i giocatori, poiché vuoi che i cacciatori iniziali siano scelti a caso dall'elenco dei giocatori.
# Calcola il numero di agenti cacciatori iniziali della partita, in base al numero di giocatori e al numero di agenti cacciatori per numero di giocatori. NumberOfPlayers:float = 1.0 * Players.Length # Converte Players.Length in un float in modo che possa essere utilizzato nella successiva funzione Limite massimo. if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Riordina i giocatori e poi seziona l'array per ottenere gli agenti cacciatori iniziali. I giocatori rimanenti sono gli agenti oggetti scenografici iniziali. var RandomizedPlayers:[]agent = Shuffle(Players)
-
Riduci l'array randomizzato fino a una dimensione compresa tra 0 e il numero di cacciatori iniziali. Questo sarà il team cacciatori iniziale, quindi impostalo su StartingHunterAgents. Il resto dei giocatori sarà il team oggetti scenografici iniziale, quindi impostali su StartingPropAgents.
# Calcola il numero di agenti cacciatori iniziali della partita, in base al numero di giocatori e al numero di agenti cacciatori per numero di giocatori. NumberOfPlayers:float = 1.0 * Players.Length # Converte Players.Length in un float in modo che possa essere utilizzato nella successiva funzione Limite massimo. if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Riordina i giocatori e poi seziona l'array per ottenere gli agenti cacciatori iniziali. I giocatori rimanenti sono gli agenti oggetti scenografici iniziali. var RandomizedPlayers:[]agent = Shuffle(Players) if (set StartingHunterAgents = RandomizedPlayers.Slice[0,NumberOfStartingHunters]) {} if (set StartingPropAgents = RandomizedPlayers.Slice[NumberOfStartingHunters,RandomizedPlayers.Length]) {} # Scorri gli agenti iniziali cacciatori e assegnali al team cacciatori. Poi avvia il timer di attesa dei cacciatori. Logger.Print("Impostazione di {StartingHunterAgents.Length} agente/i cacciatore/i.") for (StartingHunterAgent : StartingHunterAgents): HunterTeam.InitializeAgent(StartingHunterAgent) HunterTeam.WaitTimer.Start() # Scorri gli agenti iniziali oggetti scenografici e assegnali al team oggetti scenografici. Teletrasportali nell'area di gioco. Logger.Print("Impostazione di {StartingPropAgents.Length} agente/i oggetto/i scenografico/i.")
-
Quando i team sono impostati, attiva il teletrasporto della lobby per teletrasportare gli oggetti scenografici fuori dalla stanza di partenza e attiva il loro HeartBeat. Poi disattiva il teletrasporto della lobby perché non ti serve più. Infine, imposta il numero di oggetti scenografici rimanenti nel PropsRemainingTracker sulla dimensione del team oggetti scenografici.
LobbyTeleporter.Enable() for (StartingPropAgent : StartingPropAgents): PropTeam.InitializeAgent(StartingPropAgent) PropTeam.HeartBeat.SetUpUI(StartingPropAgent) LobbyTeleporter.Activate(StartingPropAgent) LobbyTeleporter.Disable() # Imposta l'obiettivo e il valore del tracciatore degli oggetti scenografici rimanenti sul numero attuale di oggetti scenografici. # In futuro, aggiorneremo il valore solo quando gli oggetti scenografici saranno eliminati. PropTeam.PropsRemainingTracker.SetTarget(PropTeam.Count()) PropTeam.UpdatePropsRemainingTracker()
Gestire le eliminazioni dei giocatori
I cacciatori vincono eliminando tutti gli oggetti scenografici e convertendoli in cacciatori. Segui questi passaggi per assegnare un punteggio ai cacciatori quando un oggetto scenografico viene eliminato e per trasferire gli oggetti scenografici eliminati al team cacciatori.
-
Crea una funzione denominata OnHunterEliminated(). In precedenza, hai eseguito l'iscrizione al dispositivo EnemyEliminatedEvent del gestore del team cacciatori, quindi si attiva ogni volta che un cacciatore elimina un oggetto scenografico.
# Quando un agente cacciatore elimina un agente oggetto scenografico, assegna un punteggio. Il punteggio viene diviso per il numero di agenti oggetti scenografici rimasti. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("L'agente cacciatore ha eliminato un agente oggetto scenografico.")
-
Per prima cosa, devi assegnare ai cacciatori un punteggio proporzionale al numero di agenti oggetti scenografici rimasti. Crea una variabile
EliminationAward
pari alMaxEliminationScore
diviso per ilPropTeamSize
. Imposta Gestione punteggio del team cacciatori su quel punteggio, quindi assegnalo al cacciatore che ha segnato l'eliminazione.# Quando un agente cacciatore elimina un agente oggetto scenografico, assegna un punteggio. Il punteggio viene diviso per il numero di agenti oggetti scenografici rimasti. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("L'agente cacciatore ha eliminato un agente oggetto scenografico.") PropTeamSize := PropTeam.Count() if (EliminationAward := Floor(HunterTeam.MaxEliminationScore / PropTeamSize)): Logger.Print("Assegnazione di {EliminationAward} punti.") HunterTeam.ScoreManager.SetScoreAward(EliminationAward HunterTeam.ScoreManager.Activate(HunterAgent)
-
Devi anche gestire cosa accade al team oggetti scenografici quando un oggetto scenografico viene eliminato. Crea una funzione denominata OnPropEliminated(). Come per OnHunterEliminated(), hai effettuato l'iscrizione a questa funzione in precedenza. Quando un oggetto scenografico viene eliminato, devi rimuoverlo dal team oggetti scenografici usando la funzione EliminateAgent() del PropTeam, quindi inizializzarlo come cacciatore con la funzione InitializeAgent() dell'HunterTeam.
# Quando un agente oggetto scenografico viene eliminato, rimuovi l'oggetto scenografico dal team oggetti scenografici, controlla la fine del round e impostalo come cacciatore. OnPropEliminated(PropAgent:agent):void = Logger.Print("Agente oggetto scenografico eliminato.") spawn{ PropTeam.EliminateAgent(PropAgent) } HunterTeam.InitializeAgent(PropAgent)
Gestione dei giocatori che entrano ed escono dal gioco
Quando un giocatore si unisce alla partita a metà round, vuoi che si generi come cacciatore.
-
Per gestire questa situazione, crea una funzione OnPlayerAdded(). Questa funzione inizializza solo il giocatore che si unisce come cacciatore.
# Quando un giocatore si unisce alla partita a metà round, rendilo un cacciatore. OnPlayerAdded(Player:player):void= Logger.Print("Un giocatore partecipa alla partita.") HunterTeam.InitializeAgent(Player)
-
L'abbandono della partita da parte dei giocatori è un po' più complicato. Se un giocatore lascia la partita, dobbiamo rimuoverlo dal team in cui si trova e verificare se la sua uscita causa la fine della partita. Questo potrebbe essere dovuto al fatto che il giocatore che se ne va era l'ultimo oggetto scenografico o l'unico cacciatore. Questa logica è gestita dalle funzioni EliminateAgent() di ogni team, quindi ne generi un'istanza a seconda del team a cui apparteneva il giocatore rimosso.
# Quando un giocatore lascia la partita, verifica in quale team si trovava e poi controlla la fine del round. OnPlayerRemoved(Player:player):void= Logger.Print("Un giocatore ha abbandonato la partita.") if (PropTeam.FindOnTeam[Player]): Logger.Print("Il giocatore era un oggetto scenografico.") spawn{ PropTeam.EliminateAgent(Player) } if (HunterTeam.FindOnTeam[Player]): Logger.Print("Il giocatore era un cacciatore.") spawn{ HunterTeam.EliminateAgent(Player) }
Fine round
Una volta che tutti i team sono stati formati, devi monitorare le dimensioni di ogni team per verificare la fine del round. La partita termina quando uno dei due team è vuoto o quando il tempo del round si esaurisce, quindi userai un'espressione race per verificare quale delle due situazioni si verifica prima.
-
Alla fine della funzione OnBegin(), in un'espressione race, inserisci la funzione Await() per il TeamEmptyEvent del team oggetti scenografici e del team cacciatori e aggiungi la funzione AwaitEnd() del RoundTimer. Una volta terminata l'espressione race, chiama la funzione EndRound() che definirai nel prossimo passaggio.
# Quando non ci sono più agenti oggetti scenografici o cacciatori (a seconda di ciò che si verifica prima), o il timer del round finisce, o il round termina race: PropTeam.TeamEmptyEvent.Await() HunterTeam.TeamEmptyEvent.Await() RoundTimer.AwaitEnd() Logger.Print("Il round sta finendo.") EndRound()
-
Nella funzione EndRound(), devi disabilitare il sensore del battito cardiaco per ogni giocatore del team oggetti scenografici e chiamare EndRound() sul dispositivo RoundSettings. Poiché la funzione EndRound() del dispositivo RoundSettings richiede che le venga passato un giocatore, prendi il primo giocatore nell'array Players e passaglielo come istigatore.
# Pulisce il VFX del battito cardiaco e termina il round. EndRound():void= PropTeam.HeartBeat.DisableAll() # Scegli un giocatore qualsiasi da passare a EndRound Players:[]player = GetPlayspace().GetPlayers() if (RoundEndInstigator := Players[0]): Logger.Print("Round terminato.") RoundSettings.EndRound(RoundEndInstigator)