Aby zastosować wiedzę o skryptach modułowych, stwórz modułowy skrypt, który umożliwia graczom podnoszenie kluczy i używanie ich do otwierania skrzynek skarbów.
Ustawienia projektu
Ten projekt obejmuje mapę startową z tablicą liderów i skryptowanymi obiektami do podnoszenia kluczy i skarbów.
Załaduj projekt startowy
W Roblox Studio otwórz zapis z dowolnego źródła: Intro doModule Scripts - Starter Project.rbxl.
Utwórz skrypt modułowy
Aby gracze mogli zdobywać skarby z skarbników, stwórz modułowy skrypt nazyający się TreasureManager. Używanie modułu skryptu połączy wszystkie pickups i wyniki w tabelach liderów.
W ServerStorage, utwórz nowy ModuleScript i zmień jego nazwę TreasureManager.
W TreasureManager zmień tabelę modułu domyślnego poprzez zastąpienie module przez TreasureManager w obu miejscach.
local TreasureManager = {}return TreasureManager
Używanie funkcji w skryptach modułu
Aby sprawdzić, jak funkcje działają w modułowych skryptach, utwórz nową funkcję o nazwie getKey(). Gdy funkcja getKey() jest wzywana z innego skryptu, otrzyma część klucza do zniszczenia i dodania 1 do liczby kluczy w wyposażeniegracza.
Utwórz funkcję modułu dla kluczy
Ten modułowy skrypt używa kombinacji modułów i lokalnych funkcji, wpisz dwa komentarze, aby pomóc Ci utrzymać je oddzielnie.
local TreasureManager = {}------------------ Lokalne funkcje------------------ Funkcje modułureturn TreasureManagerPod komentować Funkcje modułu , dodaj nową funkcję modułu TreasureManager o nazwie getKey().
Użyj dwóch parametrów:
- keyPart - część do zniszczenia.
- whichCharacter - gracz, który dotknął części kluczowej.
local TreasureManager = {}------------------ Lokalne funkcje------------------ Funkcje modułufunction TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagerW getKey() , zniszcz keyPart .
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
Użyj funkcji modułu
Teraz funkcja modułu getKey() można używać w innych skryptach. Aby przetesterować tę funkcję, otworzysz gotowy skrypt i wezwiesz go.
Otwórz skrypt kluczowy w Przestrzeni roboczej > Klucze > Kod kluczowy > 2>Kod kluczowy2>.
W keyScript, przechowywaj skrypt modułu w zmiennej nazyjącej się treasureManager i ustaw go na: require(ServerStorage:WaitForChild("TreasureManager"))
local ServerStorage = game:GetService("ServerStorage")-- Wymagaj skryptu modułu poniżej ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()Jest już funkcja nazyająca się partTouched() , aby sprawdzić, czy gracz dotyka części. Wewnątrz partTouched() :
- Zadzwoń do funkcji modułu getKey(), aby zniszczyć klucz.
- Przepustka w keyPart i whichCharacter .
local ServerStorage = game:GetService("ServerStorage")-- Wymagaj skryptu modułu 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)-- =====================================endendZacznij projekt i sprawdź, że dotykanie klucza to niszczy.
Wskazówki dotyczące rozwiązywania problemów
Problem: Otrzymaj wiadomość błędu zawierającą: "Infinite yield possible" .
Sprawdź poprawność wymowy swojego modułowego skryptu w skrypcie. Jeśli modułowy skrypt, tak jak TreasureManager, jest wymówiony nieprawidłowo, będzie błąd. Problem: Otrzymaj wiadomość błędu zawierającą: "attempt to index global" .
Sprawdź linię, która zawiera wymóg dla skryptu modułu w keyScript. Jeśli moduł nie zawiera wymagać, nie może używać funkcji i zmienne z tego modułu script. Problem:: Skrypt nie działa lub nie może podnieść kluczy.
W skrypcie modułu upewnij się, że wszystki kod jest pomiędzy local TreasureManager = {} i return TreasureManager. Wrót musi być ostatnią linią kodu w modułowym skrypcie.
Sprawdź, czy jest dwa nawiasy na końcu linii z wymagać, jak w WaitForChild("TreasureManager")) .
Utwórz lokalną funkcję
Obecnie tabela liderów śledzi klucze i skarby gracza. Aby zmienić liczby liderboard, użyj lokalnej funkcji w skrypcie modułu. Lokalna funkcja jest używana, ponieważ zmiany kluczy lub wartości skarbów gracza będą potrzebne tylko w skrypcie TreasureManager, a nie gdzie indziej.
W ServerStorage, otwórz skrypt TreasureManager.
Utwórz lokalne zmienne, aby wykonać obserwuje:
Uzyskaj usługę Graczy, aby skrypt mógł pracować z statystykami liderboardu gracza.
Przechowuj liczbę kluczy, które gracz otrzymuje po dotknięciu kluczPart.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1------------------ Lokalne funkcje------------------ Funkcje modułufunction TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManagerKopiuj i wklej te dwa lokalne funkcje w sekcji Lokalne funkcje .
getPlayerKeys() zwraca wartość lidera gracza Lockpicks .
getPlayerTreasure() zwraca wartość lidera gracza Treasure .
------------------ Lokalne funkcjelocal 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------------------ Module FunctionsAby dodać klucze gracza, w funkcji modułu getKey() :
Utwórz zmienne local, aby wezwieć getPlayerKeys(whichCharacter) .
Dodaj wartość keyDrop do playerKeys.
------------------ Funkcje modułufunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endZacznij projekt. Sprawdź, że dotykając klucza, zniszcza go i dodaje 1 do kluczy gracza na rankingwyników.
Jeśli to konieczne, sprawdź swój skrypt przeciwko jednemu poniżej dla jakichkolwiek problemów z diagnozowaniem.
Current TreasureManager Script
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ Lokalne funkcje
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łu
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager
Otrzymywanie informacji z modułowych skryptów
Skrypt modułu TreasureManager będzie używany, gdy gracze dotkną skrzyni skarbów, aby sprawdzić, czy mają co najmniej jeden klucz przed otwarciem go i podarowaniem im złota.
Sprawdź, czy skrzynie można otworzyć
Najpierw w ServerStorage > TreasureManager skrypcie ustawić zmienne dla liczby kluczy, które kosztują otwarcia skrzyni, i ile złota każdy skrzynia zawiera.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1local chestPickCost = 1local chestReward = 100------------------ Lokalne funkcjelocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endAby stworzyć funkcję, która sprawdza, czy gracz może otworzyć skrzynię, w sekcji Funkcje modułu, dodaj nową funkcję do tabeli TreasureManager o nazwie canOpenChest() z parametrem 2>whichCharacter2> .
------------------ Funkcje modułufunction TreasureManager.canOpenChest(whichCharacter)endfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endKopiuj i wklej kod poniżej w canOpenChest() , aby zwrócić true , jeśli gracz ma wystarczająco kluczy, a false , jeśli nie.
function TreasureManager.canOpenChest(whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)if playerKeys.Value >= chestPickCost thenreturn trueelsereturn falseendend
Daj graczom skarb
Aby gracz mógł otworzyć skrzynię, stwórz funkcję w TreasureManager, która przyznaje im skarb.
Dodaj nową funkcję modułu do TreasureManager nazyającą się openChest() .
Przekaż dwa argumenty:
- chestPart - część skrzyni do zniszczenia.
- whichCharacter - gracz, który daje skarb.
function TreasureManager.openChest(chestPart, whichCharacter)endAby odebrać klucze gracza i przyznać im skarb, skopiuj i wklej kod poniżej w openChest(). Ten kod używa zmienne stworzone wcześniej, takie jak chestReward , ilość skarbów dana za każdą skrzynię.
function TreasureManager.openChest(chestPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)local playerTreasure = getPlayerTreasure(whichCharacter)playerKeys.Value = playerKeys.Value - chestPickCostplayerTreasure.Value = playerTreasure.Value + chestRewardchestPart:Destroy()end
Wezwij funkcje piersi
Teraz, gdy funkcje dwóch modułów, canOpenChest() i openChest(), zostały utworzone, można je wzywać przez części skrzyni, gdy gracz dotyka ich za pomocą funkcji premade partTouched().
W Pracowniku > Skrzyni otwórz ChestScript.
Utwórz nową zmienną nazyającą się treasureManager i wymagającą skryptu modułu TreasureManager w ServerStorage .
local ServerStorage = game:GetService("ServerStorage")-- Wymagaj skryptu modułu poniżejlocal treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()W partTouched() , pod warunkiem if humanoid, stwórz nową zmienne nazwaną 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 potem pozwól mu zdobyć skarb-- =====================================local canOpen = treasureManager.canOpenChest(whichCharacter)-- =====================================endendNastępnie utwórz if, aby sprawdzić, czy canOpen jest prawdziwy.
Jeśli tak, wezwij funkcję openChest() TreasureManager.
Następnie przekaż dwa parametry: chestPart, skrzynię do zniszczenia, i whichCharacter, gracza do przyznania skarbu.
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- Sprawdź, czy gracz może otworzyć skrzynię, a potem pozwól mu zdobyć skarb-- =====================================local canOpen = treasureManager.canOpenChest(whichCharacter)if canOpen == true thentreasureManager.openChest(chestPart, whichCharacter)end-- =====================================endendZacznij projekt. Sprawdź, czy:
- Jeśli masz co najmniej 1 klucz, dotykanie skrzyni zniszczy go i przyzna skarb.
- Jeśli masz 0 kluczy, nie możesz otworzyć skarbca.
Wskazówki dotyczące rozwiązywania problemów
W ChestScript upewnij się, że funkcje z modułu skryptu, takie jak canOpenChest(), są poprawne zapisane w skrypcie TreasureManager. Każda różnica powoduje błąd.
Sprawdź, czy funkcje skopiowane i wklejone, takie jak treasureManager.openChest(), są dokładnie takie, jak pokazano w lekcji. Wszelkie różnice mogą powodować subtelne błędy w skrypcie.
Ukończone Skrypcity
Ukończono skrypt TreasureManager
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ Lokalne funkcje
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łu
function TreasureManager.openChest(chestPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
local playerTreasure = getPlayerTreasure(whichCharacter)
playerKeys.Value = playerKeys.Value - chestPickCost
playerTreasure.Value = playerTreasure.Value + chestReward
chestPart: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
Ukończono ChestScript
local ServerStorage = game:GetService("ServerStorage")
-- Wymagaj skryptu modułu 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 potem pozwól mu zdobyć skarb
-- =====================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =====================================
end
end
-- Związuje każdą część skrzyni z funkcją dotykową, aby działała na wszystkich częściach
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
Ukończony keyScript
local ServerStorage = game:GetService("ServerStorage")
-- Wymagaj skryptu modułu 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
-- Związuje każdą część klucza z funkcją dotykową, aby działał na wszystkich częściach
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
end
Podsumowanie
Zwykłym zastosowaniem modułowych skryptów w grach Roblox jest zarządzanie zwykłymi zadaniami używanych przez graczy, takimi jak przyznawanie im punktów. Dla tego przykładu stworzono modułowy skrypt nazyający się TreasureManager, aby zarządzać przyznawaniem kluczy i skarbów, gdy gracze wchodzą w interakcję z obiektami w grze.