Gestire i giocatori

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

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.

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


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

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


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

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

  1. 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 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 Giocatoresu whichSpawn .


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


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

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

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.

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

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

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

  1. In PlayerManager, aggiungi una variabile chiamata playerWeapon per l'arma nel 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
  2. In preparePlayer(), pasta 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 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 = 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 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


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

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