Gestisci i giocatori

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

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.

  1. 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 modulo
    return PlayerManager
  2. Aggiungi 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 = {}
    -- 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 = {}
    -- Funzioni locali
    -- Funzioni del modulo
    return PlayerManager
  3. Crea una funzione del modulo chiamata sendPlayersToMatch() con una stampa di test all'interno.


    -- Funzioni locali
    -- Funzioni del modulo
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return 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.

  1. 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 locali
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Aggiungi una sezione eventi sotto la funzione del tuo modulo. Quindi, connetti onPlayerJoin() al evento del Player Service PlayerAdded.


    -- Funzioni del modulo
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- Eventi
    Players.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.

  1. 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 = {}
    -- 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
  2. Usa 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.
  3. 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() .

  1. 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 locali
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- Funzioni del modulo
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. Imposta la posizione di respawn del Giocatorea whichSpawn.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Forza il personaggio a ricaricare, usando LoadCharacter() , e il giocatore respawnerà utilizzando la posizione appena assegnata.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player: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.

  1. 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 modulo
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Aggiungi 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() do
    end
    end

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.

  1. 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() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. Per 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() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Chiama 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() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. Test 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.

  1. Importa l'arma dalla Toolbox, o crea la tua (vedi Tools ).

  2. 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.

  1. In PlayerManager, aggiungi una variabile chiamata playerWeapon per l'arma in 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
  2. In preparePlayer() , incolla il seguente codice per ottenere il personaggio del Giocatore.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. Crea 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 = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    local sword = playerWeapon:Clone()
    sword.Parent = character
    end
  4. Prova 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


-- Servizi
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Script del modulo
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
while true do
repeat
task.wait(gameSettings.intermissionDuration)
print("Restarting intermission")
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("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