Twórz z użyciem skryptów modułowych

*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.

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

  1. Pobierz projekt startowy.

  2. 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.

  1. W ServerStorage utwórz nowy ModuleScript i zmień jego nazwę na TreasureManager.

  2. 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

  1. 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łowe
    return TreasureManager
  2. Pod 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łowe
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. W 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ą.

  1. Otwórz skrypt klucza w WorkspaceKeysKeyScript.

  2. 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.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. 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.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
  4. Uruchom 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.

  1. W ServerStorage otwórz skrypt TreasureManager.

  2. 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łowe
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. Skopiuj i wklej te dwie funkcje lokalne do sekcji Funkcje lokalne.

    • getPlayerKeys() zwraca wartość Lockpicks liderstats gracza.

    • getPlayerTreasure() zwraca wartość skarbu Treasure liderstats gracza.


    ------------------ 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
  4. Aby dodać klucze gracza, w funkcji modułowej getKey():

    • Stwórz zmienną lokalną, aby wywołać getPlayerKeys(whichCharacter).

    • Dodaj wartość keyDrop do playerKeys.


    ------------------ Funkcje modułowe
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. Uruchom 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ć

  1. Najpierw w ServerStorageTreasureManager 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 = 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
  2. Aby 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łowe
    function TreasureManager.canOpenChest(whichCharacter)
    end
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  3. Skopiuj 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 then
    return true
    else
    return false
    end
    end

Przyznaj skarby graczom

Aby gracz mógł otworzyć skrzynię, stwórz funkcję w TreasureManager, która przyzna im skarb.

  1. 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)
    end
  2. Aby 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 - chestPickCost
    playerTreasure.Value = playerTreasure.Value + chestReward
    chestPart.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().

  1. W WorkspaceChests otwórz ChestScript.

  2. 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żej
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. 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.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)
    -- =============================================
    end
    end
  4. Nastę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.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
  5. Uruchom 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.

©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.