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.
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łureturn PlayerManagerDodaj 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ługilocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Zmienne mapylocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Zmienne graczalocal activePlayers = {}-- Lokalne funkcje-- Funkcje modułureturn PlayerManagerStwórz funkcję modułu o nazwie sendPlayersToMatch() z wydrukiem testowym w środku.
-- Lokalne funkcje-- Funkcje modułufunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn 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.
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 funkcjelocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendDodaj sekcję wydarzeń poniżej funkcji modułu. Następnie połącz onPlayerJoin() z wydarzeniem PlayerAdded usługi Gracza.
-- Funkcje modułufunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- WydarzeniaPlayers.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.
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ługilocal ServerStorage = game:GetService("ServerStorage")-- Skrypty modułowelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerUż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.
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().
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 funkcjelocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Funkcje modułufunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endUstaw lokalizację odrodzenia gracza na whichSpawn.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendWymuszono ponowne załadowanie postaci za pomocą LoadCharacter() , a gracz odrodzi się używając nowo przypisanej lokalizacji.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer: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.
W funkcji sendPlayersToMatch() użyj zmiennej, aby stworzyć tablicę wszystkich lokalizacji spawnu na arenie, uzyskując dzieci katalogu Arena > SpawnLocations.
--Funkcje modułufunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endDodaj 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() doendend
Ś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.
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() dotable.insert(activePlayers, whichPlayer)endendAby uzyskać lokalizację spawn z areny, utwórz zmienną o nazwie i ustaw ją na pierwszy indeks w tabeli .
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endWezwij 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endTestuj 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ć.
Importuj broń z Toolbox, lub stwórz własną (patrz Tools ).
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.
W PlayerManager dodaj zmienną o nazwie playerWeapon dla broni w ServerStorage.
-- Zmienne mapylocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Zmienne graczalocal activePlayers = {}local playerWeapon = ServerStorage.WeaponW preparePlayer() wklej następujący kod, aby uzyskać postać gracza.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()endUtwó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 = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendPrzetestuj 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ługilocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skrypty modułowelocal 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
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