Con il game loop coded, è ora di iniziare ad aggiungere funzionalità in esso. Durante una Corrisponde, i giocatori possono venire e Vai. A causa di questo, il codice è necessario per le attività come l'invio di giocatori in una partita e il mantenimento di giocatori attivi. Per gestire queste attività, crea uno script di modulo chiamato PlayerManager .
Questo script inizierà una funzione per inviare i giocatori nell'arena con un'arma e sarà espandibile in seguito nella serie.
Configurazione dello script
Poiché il gestore del giocatore include funzioni utilizzate da altri script, sarà uno script del modulo.
In ServerStorage > ModuleScripts, aggiungi uno script del modulo PlayerManager. Quindi, rinomina la tabella del modulo per corrispondere al nome dello script e aggiungi commenti per le funzioni locali e modulari.
local PlayerManager = {}-- Funzioni locali-- Funzioni del moduloreturn PlayerManagerAggiungi variabili locali per il Seguendo:
Servizi:
- Giocatori - Scopri quali giocatori hanno partecipato o lasciato il Gioco.
- ServerStorage - Storage per le armi del giocatore.
变量 di mappa e giocatore:
- Lobby Spawn, Arena Folder e Arena Spawn Folder - Usato per teletrasportare i giocatori in diverse aree.
- Un array di giocatori attivi - Tiene traccia dei giocatori attualmente in una Gioco.
local PlayerManager = {}-- Servizilocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Variabili di mappalocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Variabili del giocatorelocal activePlayers = {}-- Funzioni locali-- Funzioni del moduloreturn PlayerManagerCrea una funzione del modulo chiamata sendPlayersToMatch() con una print di test all'interno.
-- Funzioni locali-- Funzioni del modulofunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn PlayerManager
Generazione di giocatori nella lobby
Al momento, ci sono più luoghi di spawn, il che significa che i giocatori spawnano in uno qualsiasi quando si uniscono al Gioco. Per garantire che i giocatori spawnino nella lobby, modifica la ProprietàRespawnLocation del Giocatore.
Crea una nuova funzione locale chiamata onPlayerJoin() con un parametro di player . In quella funzione, imposta la posizione di respawn del Giocatorenella variabile respawn della lobby fatta in precedenza.
-- Funzioni localilocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendAggiungi una sezione degli eventi sotto la tua funzione del modulo. Quindi, connetti onPlayerJoin() al evento PlayerAdded del servizio Player.
-- Funzioni del modulofunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- EventiPlayers.PlayerAdded:Connect(onPlayerJoin)
Connessione e test
Ora i moduli possono essere connessi e testati. Con il PlayerManager creato, richiedilo in modo che il codice in quel script del modulo possa poi essere eseguito e inviato ai giocatori nella lobby.
Torna a MatchManager e crea variabili per il Seguendo:
- ServerStorage servizio.
- ModuleScripts cartella, figlio di ServerStorage.
- PlayerManager script del modulo, figlio di moduleScripts.
local MatchManager = {}-- Servizilocal ServerStorage = game:GetService("ServerStorage")-- Script del modulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerUsa un server locale con almeno i giocatori minori per testare. Conferma che tu possa vedere il Seguendo:
- Tutti i giocatori spawnano nella Lobby.
- La dichiarazione di stampa da PlayerManager appare nella finestra di output.
Una volta terminato, fai clic su Cleanup per spegnere il Server.
Risolvere i problemi
A questo punto, parti dello script non stanno funzionando come previsto, prova uno dei seguenti sotto.
- Controlla il nome delle parti come l'Arena, o la posizione di Lobby > StartSpawn, specialmente se le hai nome in modo diverso da quanto insegnato nella lezione.
- Assicurati che i moduli siano richiesti in ogni script usando la funzione require() e che siano correttamente spellati.
Mandare i giocatori nell'Arena
Ora che i giocatori vengono generati nella lobby, teletrasportali in una partita una volta terminata l'interruzione. Modifica il Giocatore's RespawnLocation in una posizione di spawn in arena utilizzando una funzione nell'oggetto Player chiamata ReloadCharacter() .
Vai allo script PlayerManager , sotto onPlayerJoin() , aggiungi una nuova funzione locale chiamata preparePlayer() . Includi due parametri: 1> Giocatore1> e 4> whichSpawn4>, la posizione di spawn per inviarli.
local activePlayers = {}-- Funzioni localilocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Funzioni del modulofunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endImposta la posizione di respawn del Giocatoresu whichSpawn .
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendForza il personaggio a ricaricarsi, usando LoadCharacter() , e il giocatore respawnerà usando la loro nuova posizione assegnata.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()end
Mandare i giocatori a spawn
Assicurati che ogni giocatore venga teletrasportato in una diversa posizione di spawn in l'arena utilizzando un for loop per ripetere attraverso l' vettoredei giocatori attivi. Utilizzando un for loop puoi passare attraverso ogni valore nell' vettoredei giocatori, consentendo al script di adattarsi a una varietà di giocatori.
Nella funzione sendPlayersToMatch(), usa una variabile per creare un'area di scripting per creare un'area di scripting per tutti i luoghi di spawn dell'arena ottenendo i figli della cartella Arena > SpawnLocations .
--Funzioni del modulofunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endAggiungi il for loop sottostante per ottenere un'area di tutti i giocatori e quindi itera attraverso ciascuno di loro. Per ottenere i giocatori, inserisci / scrivi: Players:GetPlayers() .
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() doendend
Tracciamento e generazione
Quando il gioco viene eseguito, deve identificare quali utenti stanno giocando in modo che possano essere generati nell'arena. All'inizio di un round, ogni giocatore sarà tracciato in un array di giocatori attivi. Quell' array sarà utilizzato per varie funzioni, come il teletrasporto o l'assegnazione di armi, assicurandosi che i giocatori nella lobby durante un round non siano colpiti.
Nel for loop, use table.insert() , using the two parameters for the activePlayers array and the player to aggiungere or Inserire.
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)endendPer ottenere una posizione di spawn dalla arena, crea una variabile chiamata spawnLocation e impostala sul primo indice nella tabella arenaSpawns.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endChiama preparePlayer() e passa in whichPlayer e spawnLocation. Quindi, poiché quella posizione di spawn è stata utilizzata, 1> rimuovila1> dalla tabella in modo che il prossimo giocatore ottenga un differente Rigenerare.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endProva su un server locale che i giocatori vengono inviati nell'arena. I giocatori continueranno a respawnare nello stesso luogo poiché il codice per inviarli alla lobby non è ancora in Posto.
Risolvere i problemi
A questo punto, non hai visto i risultati previsti, prova uno dei seguenti sotto.
- In GetPlayers() , assicurati che ci siano due chiusure parentesi, come Class.Players.GetPlayers(|Players:GetPlayers()) nella dichiarazione.
- Controlla la serie di chiamate di funzione nei script del modulo. Ad esempio, matchManager.prepareGame() dovrebbe chiamare playerManager.sendPlayersToMatch() .
Dare alle giocatrici le armi
Quando inizia una partita, ogni giocatore nella arena riceverà un'arma da usare.
Aggiungere uno strumento
Le armi del giocatore saranno un'strumento. Mentre qualsiasi attrezzo in Roblox può essere utilizzato, abbiamo fornito una spada di esempio per Iniziare, cominciare.
Importa l'arma dalla Toolbox, o crea la tua (vedi Tools ).
Posiziona l'arma in ServerStorage. Se stai creando la tua strumento, assicurati che l'arma abbia il nome Weapon, in quanto verrà utilizzata in altri script.
Dare Strumenti ai Giocatori
Ora che lo strumento è in storage, lavora su uno script per passare attraverso l' array utente attivo e fornire ogni utente lo strumento.
In PlayerManager, aggiungi una variabile chiamata playerWeapon per l'arma nel ServerStorage.
-- Variabili di mappalocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Variabili del giocatorelocal activePlayers = {}local playerWeapon = ServerStorage.WeaponIn preparePlayer(), pasta il seguente codice per ottenere il personaggio del Giocatore.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()endCrea una nuova variabile chiamata spada e usa la funzione Clone() per creare una copia dell'arma in ServerStorage. Quindi, affidare la spada al personaggio del Giocatore.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendProva su un server locale per confermare che ogni giocatore ottenga uno strumento quando viene inviato nell'arena. Tieni presente, se continui a testare, l'interruzione si ricomincerà e così i giocatori respawneranno ogni pochi secondi. Questo sarà risolto nella prossima lezione.
Script completati
Di seguito sono gli script completati per il doppio controllo del tuo lavoro.
Script del GameManager
-- Servizilocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Script del modulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Script del MatchManager
local MatchManager = {}
-- Servizi
local ServerStorage = game:GetService("ServerStorage")
-- Script del modulo
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
end
return MatchManager
Script del modulo PlayerManager
local PlayerManager = {}
-- Servizi
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Variabili di mappa
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Variabili del giocatore
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- Funzioni locali
local function onPlayerJoin(player)
player.RespawnLocation = lobbySpawn
end
local function preparePlayer(player, whichSpawn)
player.RespawnLocation = whichSpawn
player:LoadCharacter()
local character = player.Character or player.CharacterAdded:Wait()
local sword = playerWeapon:Clone()
sword.Parent = character
end
-- Funzioni del modulo
function PlayerManager.sendPlayersToMatch()
print("Sending players to match")
local arenaSpawns = spawnLocations:GetChildren()
for playerKey, whichPlayer in Players:GetPlayers() do
table.insert(activePlayers, whichPlayer)
local spawnLocation = table.remove(arenaSpawns, 1)
preparePlayer(whichPlayer, spawnLocation)
end
end
--eventi
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager