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.
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łureturn PlayerManagerDodaj 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ługilocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Zróżnicowane Mapylocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Zróżnicowane zmiennelocal activePlayers = {}-- Lokalne funkcje-- Funkcje modułureturn PlayerManagerUtwórz funkcję modułu nazwaną sendPlayersToMatch() z drukiem testowym w środku.
-- Lokalne funkcje-- Funkcje modułufunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn 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.
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 funkcjelocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendDodaj sekcję wydarzeń pod swoją funkcją modułu. Następnie połącz onPlayerJoin() z wydarzeniem PlayerAdded służącym dla usługi gracza.
-- Funkcje modułufunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- WydarzeniaPlayers.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.
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ługilocal ServerStorage = game:GetService("ServerStorage")-- Skripty modułulocal 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 spawnują w Lobby.
- Zwrotka drukowania z PlayerManager pojawia się w oknie wyjścia.
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() .
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 funkcjelocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Funkcje modułufunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endUstaw lokalizację respawn'a gracza na whichSpawn .
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendZmusz 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 = whichSpawnplayer: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.
W funkcji sendPlayersToMatch() użyj zmiennej, aby stworzyć maszynę przetwarzającą wszystkie lokalizacje źródła danych > SpawnLocations.
--Funkcje modułufunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endDodaj 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() doendend
Ś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.
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() dotable.insert(activePlayers, whichPlayer)endendAby 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endZadzwoń 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endTestuj 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ć.
Zaimportuj broń z skrzyni z narzędziami lub stwórz własną (patrz Tools ).
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.
W PlayerManager, dodaj zmienne nazyjące się playerWeapon dla broni w Serwerze.
-- Zróżnicowane Mapylocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Zróżnicowane zmiennelocal 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ą 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 = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendTestuj 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ługilocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skripty modułulocal 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 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