Tworzenie z użyciem modułowych skryptów

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

  1. Załaduj projekt startowy.

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

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

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

  1. 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łu
    return TreasureManager
  2. Pod 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łu
    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łu

Teraz funkcja modułu getKey() można używać w innych skryptach. Aby przetesterować tę funkcję, otworzysz gotowy skrypt i wezwiesz go.

  1. Otwórz skrypt kluczowy w Przestrzeni roboczej > Klucze > Kod kluczowy > 2>Kod kluczowy2>.

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

  1. W ServerStorage, otwórz skrypt TreasureManager.

  2. 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łu
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. Kopiuj i wklej te dwa lokalne funkcje w sekcji Lokalne funkcje .

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

    • getPlayerTreasure() zwraca wartość lidera gracza Treasure .


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

    • Utwórz zmienne local, aby wezwieć getPlayerKeys(whichCharacter) .

    • Dodaj wartość keyDrop do playerKeys.


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

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

Daj graczom skarb

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

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

  1. W Pracowniku > Skrzyni otwórz ChestScript.

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