Zarządzaj graczami

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Z kodowanym cyklem gry nadszedł czas, aby zacząć dodawać do niego funkcje.Podczas dopasowywaćgracze mogą przychodzić i przechodzić, wykonywać.Z tego powodu kod jest potrzebny do zadań takich jak wysyłanie graczy do meczu i śledzenie aktywnych graczy.Aby zarządzać tymi zadaniami, stwórz skrypt modułu o nazwie PlayerManager .

Ten skrypt rozpocznie funkcję wysyłającą graczy na arenę z bronią i zostanie rozszerzony później w serii.

Ustaw skrypt

Ponieważ menadżer graczy zawiera funkcje używane przez inne skrypty, będzie to skrypt modułu.

  1. W ServerStorage > ModuleScripts dodaj nowy skrypt modułu o nazwie PlayerManager.Następnie zmień nazwę tabeli modułu, aby pasowała do nazwy skryptu, i dodaj komentarze do funkcji lokalnych i modułowych.


    local PlayerManager = {}
    -- Lokalne funkcje
    -- Funkcje modułu
    return PlayerManager
  2. Dodaj lokalne zmienne dla obserwuje:

    Usługi:

    • Gracze - Dowiedz się, jakie gracze dołączyli lub opuścili grę.
    • ServerStorage - Magazyn dla broni gracza.

    Mapa i zmienne gracza:

    • Lobby Spawn, folder Arena i folder Spawn Arena - Używane do teleportowania graczy do różnych obszarów.
    • Lista aktywnych graczy - Śledzi graczy obecnie w grze.

    local PlayerManager = {}
    -- Usługi
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Zmienne mapy
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Zmienne gracza
    local activePlayers = {}
    -- Lokalne funkcje
    -- Funkcje modułu
    return PlayerManager
  3. Stwórz funkcję modułu o nazwie sendPlayersToMatch() z wydrukiem testowym w środku.


    -- Lokalne funkcje
    -- Funkcje modułu
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return PlayerManager

Wygeneruj graczy w lobby

W tej chwili istnieje wiele lokalizacji spawnu, co oznacza, że gracze pojawiają się losowo po dołączeniu do gry.Aby zagwarantować, że gracze pojawią się w lobby, zmień właściwość gracza RespawnLocation.

  1. Stwórz nową lokalną funkcję o nazwie onPlayerJoin() z parametrem player.W tej funkcji ustaw lokalizację odrodzenia gracza na zmienną spawn w lobby ustanowioną wcześniej.


    -- Lokalne funkcje
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Dodaj sekcję wydarzeń poniżej funkcji modułu. Następnie połącz onPlayerJoin() z wydarzeniem PlayerAdded usługi Gracza.


    -- Funkcje modułu
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- Wydarzenia
    Players.PlayerAdded:Connect(onPlayerJoin)

Połącz i przetestuj

Teraz moduły mogą być połączone i przetestowane.Po utworzeniu menedżera graczy wymagaj, aby kod w tym module skryptu mógł następnie uruchomić się i wysłać graczy do lobby.

  1. Wróć do Menedżera meczów i utwórz zmienne dla obserwuje:

    • Usługa przechowywania serwera .
    • Modułowe skrypty folder, dziecko ServerStorage.
    • Skrypt modułu Menadżera Graczy dziecko skryptów modułowych.

    local MatchManager = {}
    -- Usługi
    local ServerStorage = game:GetService("ServerStorage")
    -- Skrypty modułowe
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Użyj lokalnego serwera z co najmniej minimalną liczbą graczy do testowania . Potwierdź, że możesz zobaczyć obserwuje:

    • Wszyscy gracze pojawiają się w Lobby.
    • Oświadczenie o wydruku z PlayerManager pojawia się w oknie wyjścia.
  3. Gdy skończysz, kliknij Oczyszczenie, aby wyłączyć serwer.

Wskazówki dotyczące rozwiązywania problemów

W tym momencie części skryptu nie działają tak, jak zakładano, spróbuj jednej z poniższych opcji.

  • Sprawdź nazwę części, takich jak Arena, lub lokalizację Lobby > StartSpawn, szczególnie jeśli nazwałeś je inaczej niż w lekcji.
  • Upewnij się, że moduły są wymagane w każdym skrypcie za pomocą funkcji require() i są poprawnie wymówione.

Wyślij graczy na arenę

Teraz, gdy gracze pojawiają się w lobby, teleportuj ich do meczu po zakończeniu przerwy.Zmień RespawnLocation gracza na lokalizację spawnu na arenie za pomocą funkcji w obiekcie Gracz nazywanej ReloadCharacter().

  1. Przejdź do skryptu PlayerManager , poniżej onPlayerJoin(), dodaj nową lokalną funkcję o nazwie preparePlayer().Zawór dwa parametry: player i whichSpawn , lokalizację spawnu, do której je wysłać.


    local activePlayers = {}
    -- Lokalne funkcje
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- Funkcje modułu
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. Ustaw lokalizację odrodzenia gracza na whichSpawn.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Wymuszono ponowne załadowanie postaci za pomocą LoadCharacter() , a gracz odrodzi się używając nowo przypisanej lokalizacji.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    end

Wyślij graczy do spawnu

Upewnij się, że każdy gracz zostanie teleportowany do innego miejsca odrodzenia na arenie za pomocą pętli for, aby przeszukiwać aktywną listę graczy.Użycie pętli for pozwala przejść przez każdą wartość w matrycy graczy, umożliwiając skryptowi dostosowanie się do różnych liczb graczy.

  1. W funkcji sendPlayersToMatch() użyj zmiennej, aby stworzyć tablicę wszystkich lokalizacji spawnu na arenie, uzyskując dzieci katalogu Arena > SpawnLocations.


    --Funkcje modułu
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Dodaj pętli for poniżej, aby uzyskać listę wszystkich graczy, a następnie powtarzać każdego z nich. Aby uzyskać graczy, wpisywać: Players:GetPlayers() .


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    end
    end

Śledź i generuj

Gdy gra się uruchamia, musi zidentyfikować użytkowników, którzy grają, aby mogli zostać wygenerowani na arenie.Na początku rundy każdy gracz zostanie śledzony w matrycy aktywnych graczy.Ta matryca zostanie wykorzystana do różnych funkcji, takich jak teleportowanie lub przypisywanie broni, zapewniając, że gracze nadal w lobby podczas rundy nie są dotknięci.

  1. W pędzie for użyj table.insert(), używając dwóch parametrów dla matrycy activePlayers i gracza do dodawać.


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. Aby uzyskać lokalizację spawn z areny, utwórz zmienną o nazwie i ustaw ją na pierwszy indeks w tabeli .


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Wezwij preparePlayer() i przekaż whichPlayer i spawnLocation.Następnie, ponieważ ta lokalizacja spawnu została wykorzystana, usuń ją z tabeli, aby następny gracz otrzymał inny spawn.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. Testuj na lokalnym serwerze, na który gracze są wysyłani na arenę.Gracze będą nadal odrodzać się w tym samym miejscu, ponieważ kod wysyłający ich z powrotem do lobby jeszcze nie miejsce.

Wskazówki dotyczące rozwiązywania problemów

W tym momencie nie widziałeś zamierzonych wyników, spróbuj jednego z poniższych.

  • W GetPlayers() upewnij się, że są dwa zamykające nawiasy, takie jak Class.Players.GetPlayers(|Players:GetPlayers()) w stwierdzeniu.
  • Sprawdź serię wezwań funkcji w skryptach modułu. Na przykład matchManager.prepareGame() powinno wezwać playerManager.sendPlayersToMatch() .

Dawanie graczom broni

Kiedy rozpocznie się runda, każdy gracz na arenie otrzyma broń do użycia.

Dodaj narzędzie

Bronie gracza będą narzędziem. Chociaż każde narzędzie w Roblox może być użyte, dostarczyliśmy przykładowy miecz do rozpoczynać.

  1. Importuj broń z Toolbox, lub stwórz własną (patrz Tools ).

  2. Umieść broń w ServerStorage. Jeśli tworzysz własne narzędzie, upewnij się, że nazywa się ono bronią, ponieważ zostanie użyte w późniejszych skryptach.

Daj narzędzia graczom

Teraz, gdy narzędzie jest w magazynie, pracuj nad skryptem, aby przejść przez aktywną listę graczy i dostarczyć każdemu użytkownikowi to narzędzie.

  1. W PlayerManager dodaj zmienną o nazwie playerWeapon dla broni w ServerStorage.


    -- Zmienne mapy
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Zmienne gracza
    local activePlayers = {}
    local playerWeapon = ServerStorage.Weapon
  2. W preparePlayer() wklej następujący kod, aby uzyskać postać gracza.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. Utwórz nową zmienną o nazwie miecz i użyj funkcji Clone(), aby stworzyć kopię broni w ServerStorage.Następnie przypisz miecz do postaci gracza.


    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. Przetestuj na lokalnym serwerze , aby potwierdzić, że każdy gracz otrzymuje narzędzie po wysłaniu na arenę.Pamiętaj, jeśli kontynuujesz testy, przerwa będzie nadal się restartować, a gracze będą odrodzać się co kilka sekund.Zostanie to rozwiązane w następnej lekcji.

Zakończone skrypty

Poniżej są ukończone skrypty do sprawdzenia podwójnego swojej pracy.

Skrypt Menadżera gry


-- Usługi
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Skrypty modułowe
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

Skrypt Menadżera meczów


local MatchManager = {}
-- Usługi
local ServerStorage = game:GetService("ServerStorage")
-- Skrypty modułowe
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
end
return MatchManager

Skrypt modułu PlayerManager


local PlayerManager = {}
-- Usługi
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Zmienne mapy
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Zmienne gracza
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- Lokalne funkcje
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
-- Funkcje modułu
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
--wydarzenia
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager