Con il ciclo di gioco codificato, è tempo di iniziare ad aggiungere funzionalità ad esso.Durante una Corrisponde, i giocatori possono venire e Vai.A causa di ciò, è necessario il codice per compiti come l'invio di giocatori in una partita e il monitoraggio dei giocatori attivi.Per gestire queste attività, crea uno script del modulo chiamato PlayerManager .
Questo script avvierà una funzione per inviare i giocatori nell'arena con un'arma e sarà espansa in seguito nella serie.
Configurare lo script
Poiché il gestore del giocatore include funzioni utilizzate da altri script, sarà uno script del modulo.
In ServerStorage > ModuleScripts, aggiungi un nuovo script del modulo chiamato PlayerManager.Quindi, rinomina la tabella del modulo per abbinare il nome dello script e aggiungi commenti per le funzioni locali e del modulo.
local PlayerManager = {}-- Funzioni locali-- Funzioni del moduloreturn PlayerManagerAggiungi le variabili locali per quanto Seguendo:
Servizi: ):
- Giocatori - Sai quali giocatori si sono uniti o hanno lasciato il Gioco.
- ServerStorage - Storage per armi del giocatore.
Variabili mappa e giocatore:
- Lobby Spawn, Cartella Arena e Cartella Spawn Arena - Utilizzato per teletrasportare i giocatori in diverse aree.
- Un array di giocatori attivi - Traccia i 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-- Variable del giocatorelocal activePlayers = {}-- Funzioni locali-- Funzioni del moduloreturn PlayerManagerCrea una funzione del modulo chiamata sendPlayersToMatch() con una stampa di test all'interno.
-- Funzioni locali-- Funzioni del modulofunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn PlayerManager
Genera giocatori nella lobby
Al momento, ci sono più luoghi di spawn, il che significa che i giocatori si generano in uno casuale quando si uniscono al Gioco.Per garantire che i giocatori si generino 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 Giocatorealla variabile di spawn della lobby creata in precedenza.
-- Funzioni localilocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendAggiungi una sezione eventi sotto la funzione del tuo modulo. Quindi, connetti onPlayerJoin() al evento del Player Service PlayerAdded.
-- Funzioni del modulofunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- EventiPlayers.PlayerAdded:Connect(onPlayerJoin)
Connetti e testa
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 inviare i giocatori alla lobby.
Torna a MatchManager e crea le variabili per quanto Seguendo:
- ServerStorage servizio.
- ModulesScripts cartella, figlia di ServerStorage.
- scriptdel modulo PlayerManager , 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 minimi per testare. Conferma che puoi vedere quanto Seguendo:
- Tutti i giocatori si generano nella Lobby.
- La dichiarazione di stampa da PlayerManager appare nella finestra di output.
Una volta terminato, fai clic su Pulizia per chiudere il Server.
Suggerimenti per la risoluzione dei problemi
A questo punto, parti dello script non funzionano come previsto, prova una delle seguenti.
- Controlla il nome delle parti come l'Arena, o la posizione di Lobby > StartSpawn, soprattutto se le hai nominate in modo diverso da quello indicato nella lezione.
- Assicurati che i moduli siano richiesti in ogni script utilizzando la funzione require() e che siano correttamente ortografati.
Invia i giocatori nell'arena
Ora che i giocatori si generano nella lobby, teletrasportali in una partita una volta che l'intervallo è terminato.Cambia il RespawnLocation del Giocatorein una posizione di spawn nell'arena usando una funzione nell'oggetto Player chiamata ReloadCharacter() .
Vai allo script GiocatoreManager , sotto onPlayerJoin(), aggiungi una nuova funzione locale chiamata preparePlayer().Includi due parametri: player e whichSpawn, 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 Giocatorea whichSpawn.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendForza il personaggio a ricaricare, usando LoadCharacter() , e il giocatore respawnerà utilizzando la posizione appena assegnata.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()end
Invia i giocatori a Rigenerare
Assicurati che ogni giocatore venga teletrasportato in una posizione di spawn diversa nell'arena utilizzando un ciclo for per iterare attraverso l'vettoredei giocatori attivi.L'utilizzo di un ciclo for permette di passare attraverso ogni valore nell'vettoredei giocatori, consentendo allo script di adattarsi a una varietà di numeri di giocatori.
Nella funzione sendPlayersToMatch(), usa una variabile per creare un array di 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 ciclo for sotto per ottenere un array di tutti i giocatori e quindi iterare attraverso ciascuno di essi. Per ottenere i giocatori, inserisci / scrivi: Players:GetPlayers() .
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() doendend
Traccia e genera
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 verrà tracciato in un array di giocatori attivi.Quell'array verrà utilizzato per diverse funzioni, come il teletrasporto o l'assegnazione di armi, assicurando che i giocatori ancora nella lobby durante un round non siano interessati.
Nel ciclo while, usa table.insert() , utilizzando i due parametri per l'array activePlayers e il giocatore da 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 dall'arena, crea una variabile chiamata spawnLocation e impostala sull' primo indice nell'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é è stata utilizzata la posizione di spawn, rimuovi dal tavolo in modo che il prossimo giocatore ottenga un diverso Rigenerare.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endTest su un server locale locale su cui i giocatori vengono inviati nell'arena.I giocatori continueranno a respawnare nello stesso luogo perché il codice per rimandarli alla lobby non è ancora in Posto.
Suggerimenti per la risoluzione dei problemi
A questo punto, non hai visto i risultati previsti, prova uno dei seguenti.
- In GetPlayers() , assicurati che ci siano due parentesi di chiusura, come Class.Players.GetPlayers(|Players:GetPlayers()) nella dichiarazione.
- Controlla la serie di chiamate di funzione negli script del modulo. Ad esempio, matchManager.prepareGame() dovrebbe chiamare playerManager.sendPlayersToMatch() .
Dare alle giocatori armi
Quando inizia una partita, a ogni giocatore nella arena verrà fornita un'arma da utilizzare.
Aggiungi uno strumento
Le armi del giocatore saranno uno strumento. Mentre qualsiasi strumento 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 nel ServerStorage. Se stai creando il tuo strumento, assicurati che lo strumento si chiami Arma, poiché verrà utilizzato in script successivi.
Dai strumenti ai giocatori
Ora che lo strumento è in storage, lavora su uno script per passare attraverso l'array di giocatori attivi e fornire ogni utente lo strumento.
In PlayerManager, aggiungi una variabile chiamata playerWeapon per l'arma in ServerStorage.
-- Variabili di mappalocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Variable del giocatorelocal activePlayers = {}local playerWeapon = ServerStorage.WeaponIn preparePlayer() , incolla 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 sword e usa la funzione Clone() per creare una copia dell'arma in ServerStorage.Quindi, genitori 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 riceve uno strumento quando inviato all'arena.Tieni presente, se continui a testare, l'interruzione continuerà a riavviarsi e così i giocatori respawneranno ogni pochi secondi.Questo verrà risolto nella lezione successiva.
Script completati
Di seguito sono completati gli script per controllare due volte il tuo lavoro.
scriptdi 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
scriptdi 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
scriptdel modulo Gestore giocatore
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
-- Variable 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