
Aby zastosować swoją wiedzę na temat skryptów modułowych, stwórz skrypt modułowy, który pozwala graczom zbierać klucze i używać ich do otwierania skrzyń skarbów.
Ustawienie projektu
Ten projekt zawiera mapę startową z liderem i skryptowanymi obiektami do zbierania kluczy i skrzyń skarbów.
Załaduj projekt startowy
W Roblox Studio otwórz pobrany plik: Intro to Module Scripts - Starter Project.rbxl.

Stwórz skrypt modułowy
Aby gracze mogli zdobywać skarby z skrzyń, stwórz skrypt modułowy o nazwie TreasureManager. Użycie skryptu modułowego połączy zbieranie przedmiotów i liderów.
W ServerStorage utwórz nowy ModuleScript i zmień jego nazwę na TreasureManager.

W TreasureManager zmień nazwę domyślnej tabeli modułu, zastępując module na TreasureManager w obu miejscach.
local TreasureManager = {}return TreasureManager
Używaj funkcji w skryptach modułowych
Aby przetestować, jak działają funkcje w skryptach modułowych, stwórz nową funkcję o nazwie getKey(). Kiedy funkcja getKey() zostanie wywołana z innego skryptu, otrzyma część kluczową do zniszczenia i doda 1 do liczby kluczy w ekwipunku gracza.
Stwórz funkcję modułową dla kluczy
Ten skrypt modułowy użyje kombinacji funkcji modułowych i lokalnych, wpisz dwa komentarze, aby pomóc sobie je rozdzielić.
local TreasureManager = {}------------------ Funkcje lokalne------------------ Funkcje modułowereturn TreasureManagerPod komentarzem Funkcje modułowe dodaj nową funkcję modułową do TreasureManager o nazwie getKey().
Użyj dwóch parametrów:
- keyPart - część do zniszczenia.
- whichCharacter - gracz, który dotknął części kluczowej.
local TreasureManager = {}------------------ Funkcje lokalne------------------ Funkcje modułowefunction TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagerW getKey() zniszcz keyPart.
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
Użyj funkcji modułowej
Teraz funkcję modułową getKey() można używać w innych skryptach. Aby przetestować tę funkcję, otwórz przygotowany skrypt i wywołaj ją.
Otwórz skrypt klucza w Workspace ⟩ Keys ⟩ KeyScript.
W keyScript przechowaj skrypt modułowy w zmiennej nazwanej treasureManager i ustaw ją na: require(ServerStorage:WaitForChild("TreasureManager"))
local ServerStorage = game:GetService("ServerStorage")-- Require skrypt modułowy poniżej ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()Istnieje już funkcja o nazwie partTouched(), aby sprawdzać, czy gracz dotknął części. Wewnątrz partTouched():
- Wywołaj funkcję modułową getKey(), aby zniszczyć klucz.
- Przekaż keyPart i whichCharacter.
local ServerStorage = game:GetService("ServerStorage")-- Require skrypt modułowy poniżej ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()local function partTouched(otherPart, keyPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- Daj graczowi klucz i zniszcz część klucza-- =============================================treasureManager.getKey(keyPart, whichCharacter)-- =============================================endendUruchom projekt i sprawdź, czy dotykając klucza, go zniszczysz.
Porady dotyczące rozwiązywania problemów
Problem: Otrzymujesz komunikat o błędzie zawierający: "Infinite yield possible".
- Sprawdź pisownię swojego skryptu modułowego w skrypcie. Jeśli skrypt modułowy, taki jak TreasureManager, jest napisany inaczej, pojawi się błąd.
Problem: Otrzymujesz komunikat o błędzie zawierający: "attempt to index global".
- Sprawdź linię, która zawiera wymóg dla skryptu modułowego w keyScript. Jeśli moduł nie zawiera wymogu, nie może używać funkcji i zmiennych z tego skryptu modułowego.
Problem: Skrypt nie działa lub nie może zbierać kluczy.
W skrypcie modułowym upewnij się, że cały kod znajduje się między local TreasureManager = {} a return TreasureManager. Zwrócenie musi być ostatnią linią kodu w skrypcie modułowym.
Sprawdź, czy na końcu linii z wymogiem znajdują się dwie nawiasy, jak w WaitForChild("TreasureManager")).
Stwórz funkcję lokalną
W tej chwili, lider śledzi klucze i skarby gracza. Aby zmienić liczby na liderze, użyj funkcji lokalnej w skrypcie modułowym. Funkcja lokalna jest używana, ponieważ zmiana wartości kluczy lub skarbu gracza będzie potrzebna tylko w skrypcie TreasureManager, a nie gdzie indziej.
W ServerStorage otwórz skrypt TreasureManager.
Stwórz zmienne lokalne, aby wykonać następujące operacje:
Uzyskaj usługę Players, aby skrypt mógł działać z wartościami leaderstats graczy.
Przechowuj liczbę kluczy, które gracz otrzymuje po dotknięciu keyPart.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1------------------ Funkcje lokalne------------------ Funkcje modułowefunction TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManagerSkopiuj i wklej te dwie funkcje lokalne do sekcji Funkcje lokalne.
getPlayerKeys() zwraca wartość Lockpicks liderstats gracza.
getPlayerTreasure() zwraca wartość skarbu Treasure liderstats gracza.
------------------ Funkcje lokalnelocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endlocal function getPlayerTreasure(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Treasure")end------------------ Funkcje modułoweAby dodać klucze gracza, w funkcji modułowej getKey():
Stwórz zmienną lokalną, aby wywołać getPlayerKeys(whichCharacter).
Dodaj wartość keyDrop do playerKeys.
------------------ Funkcje modułowefunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endUruchom projekt. Sprawdź, czy dotykając klucza, go zniszczysz i dodasz 1 do kluczy gracza na liderze.

Jeśli potrzebujesz, sprawdź swój skrypt w porównaniu do poniższego, aby rozwiązać ewentualne problemy.
Bieżący skrypt TreasureManager
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ Funkcje lokalne
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ Funkcje modułowe
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager
Uzyskaj informacje ze skryptów modułowych
Skrypt modułowy TreasureManager będzie używany, gdy gracze dotkną skrzyni skarbów, aby sprawdzić, czy mają przynajmniej jeden klucz przed jej otwarciem i przyznaniem im złota.
Sprawdź, czy skrzynie można otworzyć
Najpierw w ServerStorage ⟩ TreasureManager ustaw zmienne dotyczące liczby kluczy, które kosztuje otwarcie skrzyni oraz ilości złota, które zawiera każda skrzynia.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1local chestPickCost = 1local chestReward = 100------------------ Funkcje lokalnelocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endAby stworzyć funkcję, która sprawdzi, czy gracz może otworzyć skrzynię, w sekcji Funkcje modułowe dodaj nową funkcję do tabeli TreasureManager o nazwie canOpenChest() z parametrem whichCharacter.
------------------ Funkcje modułowefunction TreasureManager.canOpenChest(whichCharacter)endfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endSkopiuj i wklej poniższy kod do canOpenChest(), aby zwrócić true, jeśli gracz ma wystarczająco kluczy, i false, jeśli nie ma.
function TreasureManager.canOpenChest(whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)if playerKeys.Value >= chestPickCost thenreturn trueelsereturn falseendend
Przyznaj skarby graczom
Aby gracz mógł otworzyć skrzynię, stwórz funkcję w TreasureManager, która przyzna im skarb.
Dodaj nową funkcję modułową do TreasureManager o nazwie openChest().
Przekaż dwa argumenty:
- chestPart - część skrzyni do zniszczenia.
- whichCharacter - gracz, któremu należy przyznać skarb.
function TreasureManager.openChest(chestPart, whichCharacter)endAby odjąć klucze gracza i przyznać mu skarb, skopiuj i wklej poniższy kod do openChest(). Ten kod korzysta z wcześniej utworzonych zmiennych, takich jak chestReward, ilość skarbu przyznawana za skrzynię.
function TreasureManager.openChest(chestPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)local playerTreasure = getPlayerTreasure(whichCharacter)playerKeys.Value = playerKeys.Value - chestPickCostplayerTreasure.Value = playerTreasure.Value + chestRewardchestPart.Parent:Destroy()end
Wywołaj funkcje skrzyni
Teraz, gdy dwie funkcje modułowe, canOpenChest() i openChest(), zostały utworzone, mogą być wywoływane przez części skrzyni za każdym razem, gdy gracz je dotknie, używając przygotowanej funkcji partTouched().
W Workspace ⟩ Chests otwórz ChestScript.
Stwórz nową zmienną o nazwie treasureManager i załaduj skrypt modułowy TreasureManager w ServerStorage.
local ServerStorage = game:GetService("ServerStorage")-- Require skrypt modułowy poniżejlocal treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()W partTouched(), pod instrukcją if humanoid, utwórz nową zmienną o nazwie canOpen i ustaw ją równą:
treasureManager.canOpenChest(whichCharacter)
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- Sprawdź, czy gracz może otworzyć skrzynię, a następnie pozwól mu zdobyć skarb-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)-- =============================================endendNastępnie utwórz instrukcję if, aby sprawdzić, czy canOpen jest prawdziwe.
Jeśli tak, wywołaj funkcję openChest() skryptu TreasureManager.
Następnie przekaż dwa parametry: chestPart, skrzynię do zniszczenia, oraz whichCharacter, gracza, któremu przyznasz skarb.
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- Sprawdź, czy gracz może otworzyć skrzynię, a następnie pozwól mu zdobyć skarb-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)if canOpen == true thentreasureManager.openChest(chestPart, whichCharacter)end-- =============================================endendUruchom projekt. Sprawdź czy:
- Jeśli masz przynajmniej 1 klucz, dotknięcie skrzyni zniszczy ją i przyzna skarb.
- Jeśli masz 0 kluczy, nie możesz otworzyć skrzyni skarbów.
Porady dotyczące rozwiązywania problemów
W ChestScript upewnij się, że funkcje wywoływane ze skryptu modułowego, takie jak canOpenChest(), są napisane dokładnie tak, jak są w skrypcie TreasureManager. Jakakolwiek różnica spowoduje błąd.
Sprawdź, czy skopiowane i wklejone funkcje, takie jak treasureManager.openChest(), są dokładnie takie, jak pokazano w lekcji. Jakiekolwiek różnice mogą powodować subtelne błędy w skrypcie.
Zakończone skrypty
Zakończony skrypt TreasureManager
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ Funkcje lokalne
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ Funkcje modułowe
function TreasureManager.openChest(chestPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
local playerTreasure = getPlayerTreasure(whichCharacter)
playerKeys.Value = playerKeys.Value - chestPickCost
playerTreasure.Value = playerTreasure.Value + chestReward
chestPart.Parent:Destroy()
end
function TreasureManager.canOpenChest(whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
if playerKeys.Value >= chestPickCost then
return true
else
return false
end
end
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager
Zakończony skrypt ChestScript
local ServerStorage = game:GetService("ServerStorage")
-- Require skrypt modułowy poniżej ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local chests = script.Parent
local chestsFolder = chests.Parts
local chestsArray = chestsFolder:GetChildren()
local function partTouched(otherPart, chestPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- Sprawdź, czy gracz może otworzyć skrzynię, a następnie pozwól mu zdobyć skarb
-- =============================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =============================================
end
end
-- Powiązania każdej części skrzyni z funkcją dotyku, aby działało na wszystkich częściach
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]:WaitForChild("Collider")
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
Zakończony skrypt keyScript
local ServerStorage = game:GetService("ServerStorage")
-- Require skrypt modułowy poniżej ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local keys = script.Parent
local keysFolder = keys.Parts
local keysArray = keysFolder:GetChildren()
local function partTouched(otherPart, keyPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- Daj graczowi klucz i zniszcz część klucza
-- =============================================
treasureManager.getKey(keyPart, whichCharacter)
-- =============================================
end
end
-- Powiązania każdej części klucza z funkcją dotyku, aby działało na wszystkich częściach
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
end
Podsumowanie
Powszechnym zastosowaniem skryptów modułowych w doświadczeniach Roblox jest obsługa standardowych zadań wykorzystywanych przez graczy, takich jak przyznawanie im punktów. W tym przykładzie stworzono skrypt modułowy o nazwie TreasureManager, aby zarządzać przyznawaniem graczom kluczy i skarbów, gdy interagują z obiektami w grze.