Zarządzanie 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 kodem pętli gry, nadszedł czas, aby dodać funkcje do niego. Podczas dopasowywaćgracze mogą przyjść i przechodzić, wykonywać. Z tego powodu kod jest niezbędny do zadań, takich jak wysyłanie graczy do meczu i utrzymywanie aktywnych graczy. Aby zarządzać tymi zadaniami, stwórz skrypt modułowy nazyający się PlayerManager .

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

Konfiguracja skryptu

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

  1. W SerwerzePrzechowywania > ModułScriptów, dodaj nowy modułowy skrypt nazyający się PlayerManager. Następnie zmień tabelę modułu, aby dopasować nazwę skryptu i dodać komentarze dla lokalnych i funkcji modułu.


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

    Usługi:

    • Gracze - Wiedz, którzy gracze zostali połączeni lub opuścili grę.
    • ServerStorage - Przechowywanie broni gracza.

    Warianty Mapy i Gracza:

    • Lobby Spawn, Arena Folder i Arena Spawn Folder - Używany do teleportowania graczy do różnych obszarów.
    • Materiały Arrays - Przechowuje ścieżkę graczy w grze.

    local PlayerManager = {}
    -- Usługi
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Zróżnicowane Mapy
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Zróżnicowane zmienne
    local activePlayers = {}
    -- Lokalne funkcje
    -- Funkcje modułu
    return PlayerManager
  3. Utwórz funkcję modułu nazwaną sendPlayersToMatch() z drukiem testowym w środku.


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

Generowanie graczy w lobby

W tej chwili istnieje wiele lokalizacji spawn, co oznacza, że gracze spawnują w losowej lokalizacji, gdy dołączają do gry. Aby zagwarantować, że gracze spawnują w lobby, zmień właściwość RespawnLocation gracza.

  1. Utwórz nową lokalną funkcję nazyającą się onPlayerJoin() z parametrem player . W tej funkcji ustaw lokalizację respawn'u gracza na zmianę z poprzednim parametrem.


    -- Lokalne funkcje
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Dodaj sekcję wydarzeń pod swoją funkcją modułu. Następnie połącz onPlayerJoin() z wydarzeniem PlayerAdded służącym dla usługi gracza.


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

Łączenie i testowanie

Teraz można połączyć i przetestować moduły. Z zarządzaczem graczy stworzonym, wymagaj go, aby kod w tym skrypcie modułu mógł zostać wykonany i wysłany do lobby.

  1. Powróć do MatchManager i stwórz zmienne dla obserwujerzeczy:

    • serwerStorage usługa.
    • Katalog modułów zapisu dyskowego, dziecko ServerStorage.
    • PlayerManager moduł script, dziecko modułScripts.

    local MatchManager = {}
    -- Usługi
    local ServerStorage = game:GetService("ServerStorage")
    -- Skripty modułu
    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 spawnują w Lobby.
    • Zwrotka drukowania z PlayerManager pojawia się w oknie wyjścia.
  3. Kiedy skończysz, kliknij Uruchom, aby zamknąć serwer.

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

W tym momencie części skryptu nie działają tak, jak powinny, 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ż zalecano w lekcji.
  • Upewnij się, że w każdym skrypcie wymagane są moduły używając funkcji require() i poprawnie zapisane.

Wysyłanie graczy na arenę

Teraz, gdy gracze pojawiają się w lobby, teleportuj je do meczu, gdy przerwa się przerwa. Zmień RespawnLocation gracza na lokalizację wygranej w arenie, używając funkcji w obiekcie gracza nazyającą się ReloadCharacter() .

  1. Idź do PlayerManager skryptu, poniżej onPlayerJoin(), dodaj nową lokalną funkcję nazyającą się preparePlayer(). Włącz dwa parametry: 2> gracz2> i 5> whichSpawn5>, lokalizację wyświetlenia, do której należy 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ę respawn'a gracza na whichSpawn .


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Zmusz postać do ponownego załadowania używając LoadCharacter() , a gracz będzie respawnować używając ich nowo przypisanej lokalizacji.


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

Wysyłanie graczy do spawn

Upewnij się, że każdy gracz zostanie przeniesiony do innej lokalizacji spawn w arenie, używając pętli for, aby przetworzyć przez aktywną listę graczy. Używając pętli for, możesz przejść przez każdą wartość w listce graczy, pozwalając skryptowi dostosować się do różnych liczb graczy.

  1. W funkcji sendPlayersToMatch() użyj zmiennej, aby stworzyć maszynę przetwarzającą wszystkie lokalizacje źródła danych > SpawnLocations.


    --Funkcje modułu
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Dodaj poniższy for pętę, aby uzyskać maszynę czasową wszystkich graczy i następnie cyklicznie poprzez każde z nich. Aby uzyskać graczy, wpisywać: Players:GetPlayers() .


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

Śledzenie i generowanie

Gdy gra się uruchomia, musi zidentyfikować, którzy gracze grają, aby mogli zostać włączeni do aren. Na początku rundy każdy gracz będzie śledzony w maszynie aniżeli w grze na żywo, zapewniając, że gracze nadal w lobby podczas rundy nie są zainteresowane.

  1. W pętli for, użyj table.insert() , używając dwóch parametrów dla activePlayers zapisu 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ę wyjścia z arena, utwórz zmienne nazyjące się spawnLocation i ustaw go na pierwszy pierwszy indeks w tabeli arenaSpawns.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Zadzwoń do preparePlayer() i przekaż w whichPlayer i spawnLocation. Następnie, ponieważ ten następny gracz użył tego lokalizacji, usuń go z tabeli, aby następny gracz otrzymał inny lokalizację.


    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órym gracze są wysyłani do aren. Gracze będą nadal rejenerować w tym samym lokalizatorze, ponieważ kod wysyłania ich do lobbies jeszcze się nie pojawił.

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

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

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

Dawanie graczom broni

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

Dodanie narzędzia

Broń gracza będzie narzędziem. Chociaż każde narzędzie w Roblox można używać, zapewniliśmy przykładowy miecz, aby rozpoczynać.

  1. Zaimportuj broń z skrzyni z narzędziami lub stwórz własną (patrz Tools ).

  2. Umieść broń w ServerStorage. Jeśli tworzysz własny narzędzie, upewnij się, że narzędzie ma nazwę Weapon, ponieważ będzie używana w późniejszych skryptach.

Dawanie narzędzi graczom

Teraz, gdy narzędzie jest w magazynie, pracuj nad skryptem, aby przejść przez aktywny węzłę gracza i zapewnić każdemu użytkownikowi narzędzie.

  1. W PlayerManager, dodaj zmienne nazyjące się playerWeapon dla broni w Serwerze.


    -- Zróżnicowane Mapy
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Zróżnicowane zmienne
    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ą zmienne nazyającą się miecz i użyj funkcji Clone() aby utworzyć kopię broni w ServerStorage. Następnie przywiąż 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. Testuj na lokalnym serwerze , aby potwierdzić, że każdy gracz otrzymuje narzędzie, gdy wysyłany jest na arenę. Pamiętaj, że jeśli nadal będziesz testować, przerwa będzie się ponawiała i więc gracze będą się odnawiać co kilka sekund. To zostanie rozwiązane w następnym lekcji.

Ukończone Skrypcity

Poniżej znajdują się zakończone skrypty, aby podwoić sprawdzenie swojej pracy.

Skrypt GameManager


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


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

Script modułu PlayerManager


local PlayerManager = {}
-- Usługi
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Zróżnicowane Mapy
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Zróżnicowane zmienne
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
--zdarzenia
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager