Tạo với các script mô-đun

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Để áp dụng kiến thức của bạn về các script mô-đun, hãy tạo một script mô-đun cho phép người chơi nhặt chìa khóa và sử dụng chúng để mở rương kho báu.

Thiết lập dự án

Dự án này bao gồm một bản đồ khởi động với bảng xếp hạng và các đối tượng nhặt được có kịch bản cho chìa khóa và rương kho báu.

Tải dự án khởi động

  1. Tải xuống dự án khởi động.

  2. Trong Roblox Studio, mở tệp đã tải xuống: Intro to Module Scripts - Starter Project.rbxl.

Tạo một script mô-đun

Để người chơi có thể nhận kho báu từ các rương, hãy tạo một script mô-đun có tên là TreasureManager. Sử dụng một script mô-đun sẽ kết nối các đối tượng nhặt được và bảng xếp hạng với nhau.

  1. Trong ServerStorage, tạo một ModuleScript mới và đổi tên thành TreasureManager.

  2. Trong TreasureManager, đổi tên bảng mô-đun mặc định bằng cách thay thế module bằng TreasureManager ở cả hai vị trí.

    local TreasureManager = {}
    return TreasureManager

Sử dụng các hàm trong các script mô-đun

Để kiểm tra cách các hàm hoạt động trong các script mô-đun, hãy tạo một hàm mới có tên là getKey(). Khi hàm getKey() được gọi từ một script khác, nó sẽ nhận một phần chìa khóa để hủy và thêm 1 vào số lượng chìa khóa trong kho đồ của người chơi.

Tạo một hàm mô-đun cho chìa khóa

  1. Script mô-đun này sẽ sử dụng sự kết hợp của các hàm mô-đun và hàm cục bộ, hãy gõ hai chú thích để giúp bạn giữ chúng tách biệt.

    local TreasureManager = {}
    ------------------ Các Hàm Cục Bộ
    ------------------ Các Hàm Mô-đun
    return TreasureManager
  2. Dưới chú thích Các Hàm Mô-đun, thêm một hàm mô-đun mới vào TreasureManager có tên là getKey().

    Sử dụng hai tham số:

    • keyPart - phần để hủy.
    • whichCharacter - người chơi đã chạm vào phần chìa khóa.
    local TreasureManager = {}
    ------------------ Các Hàm Cục Bộ
    ------------------ Các Hàm Mô-đun
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. Trong getKey(), hủy keyPart.

    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end

Sử dụng hàm mô-đun

Bây giờ, hàm mô-đun getKey() có thể được sử dụng trong các script khác. Để kiểm tra hàm đó, bạn sẽ mở một script đã được tạo sẵn và gọi nó.

  1. Mở script chìa khóa trong WorkspaceKeysKeyScript.

  2. Trong keyScript, lưu script mô-đun vào một biến có tên là treasureManager và gán nó bằng: require(ServerStorage:WaitForChild("TreasureManager"))

    local ServerStorage = game:GetService("ServerStorage")
    -- Yêu cầu script mô-đun bên dưới ⯆
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. Đã có một hàm có tên là partTouched() để kiểm tra xem một người chơi có chạm vào phần hay không. Bên trong partTouched():

    • Gọi hàm mô-đun getKey() để hủy chìa khóa.
    • Truyền vào keyPartwhichCharacter.
    local ServerStorage = game:GetService("ServerStorage")
    -- Yêu cầu script mô-đun bên dưới ⯆
    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
    -- Tặng cho người chơi một chìa khóa và hủy phần chìa khóa
    -- =============================================
    treasureManager.getKey(keyPart, whichCharacter)
    -- =============================================
    end
    end
  4. Chạy dự án và kiểm tra rằng việc chạm vào một chìa khóa sẽ hủy nó.

Mẹo khắc phục sự cố

Vấn đề: Nhận thông báo lỗi bao gồm: "Infinite yield possible".

  • Kiểm tra chính tả của script mô-đun của bạn trong một script. Nếu một script mô-đun, như TreasureManager, được viết khác đi, sẽ có lỗi.

Vấn đề: Nhận thông báo lỗi bao gồm: "attempt to index global".

  • Kiểm tra dòng bao gồm yêu cầu cho script mô-đun trong keyScript. Nếu mô-đun không bao gồm yêu cầu, nó không thể sử dụng các hàm và biến từ script mô-đun đó.

Vấn đề: Script không chạy hoặc không thể nhặt chìa khóa.

  • Trong script mô-đun, hãy đảm bảo rằng tất cả mã đều nằm giữa local TreasureManager = {}return TreasureManager. Dòng trả về phải là dòng mã cuối cùng trong một Script Mô-đun.

  • Kiểm tra rằng có hai dấu ngoặc đơn ở cuối dòng với yêu cầu, như trong WaitForChild("TreasureManager")).

Tạo một Hàm Cục Bộ

Hiện tại, một bảng xếp hạng theo dõi chìa khóa và kho báu của người chơi. Để thay đổi số liệu trên bảng xếp hạng, hãy sử dụng một hàm cục bộ trong script mô-đun. Một hàm cục bộ được sử dụng vì việc thay đổi giá trị chìa khóa hoặc kho báu của người chơi chỉ cần thiết trong script TreasureManager, không ở bất kỳ đâu khác.

  1. Trong ServerStorage, mở script TreasureManager.

  2. Tạo các biến cục bộ để thực hiện các điều sau:

    • Lấy dịch vụ Players để script có thể làm việc với thống kê bảng xếp hạng của người chơi.

    • Lưu số lượng chìa khóa mà người chơi nhận được sau khi chạm vào keyPart.

    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    ------------------ Các Hàm Cục Bộ
    ------------------ Các Hàm Mô-đun
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. Sao chép và dán hai hàm cục bộ này vào phần Các Hàm Cục Bộ.

    • getPlayerKeys() trả về giá trị của Lockpicks leaderstat của người chơi.

    • getPlayerTreasure() trả về giá trị của Treasure leaderstat của người chơi.

    ------------------ Các Hàm Cục Bộ
    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
    ------------------ Các Hàm Mô-đun
  4. Để thêm vào số chìa khóa của người chơi, trong hàm getKey() mô-đun:

    • Tạo một biến local để gọi getPlayerKeys(whichCharacter).

    • Thêm giá trị của keyDrop vào playerKeys.

    ------------------ Các Hàm Mô-đun
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. Chạy dự án. Kiểm tra rằng việc chạm vào một chìa khóa sẽ hủy nó và thêm 1 vào số chìa khóa của người chơi trong bảng xếp hạng.

Nếu cần, hãy kiểm tra script của bạn với script bên dưới để tìm bất kỳ vấn đề khắc phục sự cố nào.

Script TreasureManager Hiện Tại
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ Các Hàm Cục Bộ
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
------------------ Các Hàm Mô-đun
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager

Lấy thông tin từ các script mô-đun

Script mô-đun TreasureManager sẽ được sử dụng khi người chơi chạm vào một rương kho báu để kiểm tra xem họ có ít nhất một chìa khóa trước khi mở nó và tặng cho họ vàng.

Kiểm tra xem rương có thể mở được không

  1. Đầu tiên trong script TreasureManagerServerStorage, thiết lập các biến cho số lượng chìa khóa cần thiết để mở một rương, và số vàng mà mỗi rương chứa.

    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    local chestPickCost = 1
    local chestReward = 100
    ------------------ Các Hàm Cục Bộ
    local function getPlayerKeys(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Lockpicks")
    end
  2. Để tạo một hàm kiểm tra xem người chơi có thể mở một rương hay không, trong phần Các Hàm Mô-đun, thêm một hàm mới vào bảng TreasureManager có tên là canOpenChest() với tham số whichCharacter.

    ------------------ Các Hàm Mô-đun
    function TreasureManager.canOpenChest(whichCharacter)
    end
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  3. Sao chép và dán mã dưới đây vào canOpenChest() để trả về true nếu người chơi có đủ chìa khóa, và false nếu họ không có.

    function TreasureManager.canOpenChest(whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    if playerKeys.Value >= chestPickCost then
    return true
    else
    return false
    end
    end

Tặng kho báu cho người chơi

Để người chơi có thể mở một rương, hãy tạo một hàm trong TreasureManager để tặng cho họ kho báu.

  1. Thêm một hàm mô-đun mới vào TreasureManager có tên là openChest().

    Truyền vào hai đối số:

    • chestPart - phần rương để hủy.
    • whichCharacter - người chơi để tặng kho báu.
    function TreasureManager.openChest(chestPart, whichCharacter)
    end
  2. Để trừ đi số chìa khóa của người chơi và tặng cho họ kho báu, sao chép và dán mã dưới đây vào openChest(). Mã này sử dụng các biến đã được tạo trước đó, như chestReward, số lượng kho báu được tặng cho mỗi rương.

    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

Gọi các hàm rương

Bây giờ mà hai hàm mô-đun, canOpenChest()openChest(), đã được tạo, chúng có thể được gọi bởi các phần Rương bất cứ khi nào một người chơi chạm vào chúng bằng cách sử dụng hàm partTouched() đã được tạo sẵn.

  1. Trong WorkspaceChests, mở ChestScript.

  2. Tạo một biến mới có tên là treasureManager và yêu cầu script mô-đun TreasureManager trong ServerStorage.

    local ServerStorage = game:GetService("ServerStorage")
    -- Yêu cầu script mô-đun bên dưới
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. Trong partTouched(), dưới câu lệnh if humanoid, tạo một biến mới có tên là canOpen và gán nó bằng:

    treasureManager.canOpenChest(whichCharacter)

    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- Kiểm tra xem người chơi có thể mở một rương, sau đó cho họ kho báu
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    -- =============================================
    end
    end
  4. Tiếp theo, tạo một câu lệnh if để kiểm tra xem canOpen có đúng không.

    • Nếu đúng, gọi hàm openChest() của TreasureManager.

    • Sau đó, truyền vào hai tham số: chestPart, rương để hủy, và whichCharacter, người chơi để tặng kho báu.

    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- Kiểm tra xem người chơi có thể mở một rương, sau đó cho họ kho báu
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    if canOpen == true then
    treasureManager.openChest(chestPart, whichCharacter)
    end
    -- =============================================
    end
    end
  5. Chạy dự án. Kiểm tra rằng:

    • Nếu bạn có ít nhất 1 chìa khóa, việc chạm vào một rương sẽ hủy nó và tặng kho báu.
    • Nếu bạn có 0 chìa khóa, bạn không thể mở một rương kho báu.

Mẹo khắc phục sự cố

  • Trong ChestScript, hãy đảm bảo rằng các hàm được gọi từ script mô-đun như canOpenChest() được viết chính xác như chúng được tìm thấy trong script TreasureManager. Bất kỳ sự khác biệt nào sẽ gây ra lỗi.

  • Kiểm tra rằng các hàm đã sao chép và dán, như treasureManager.openChest(), chính xác như được hiển thị trong bài học. Bất kỳ sự khác biệt nào có thể gây ra lỗi tinh vi trong script.

Các script hoàn chỉnh

Script TreasureManager Hoàn Chỉnh
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ Các Hàm Cục Bộ
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
------------------ Các Hàm Mô-đun
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
Script ChestScript Hoàn Chỉnh
local ServerStorage = game:GetService("ServerStorage")
-- Yêu cầu script mô-đun bên dưới ⯆
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
-- Kiểm tra xem người chơi có thể mở một rương, sau đó cho họ kho báu
-- =============================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =============================================
end
end
-- Liên kết mọi phần rương với hàm chạm để nó hoạt động trên tất cả các phần
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]:WaitForChild("Collider")
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
Script keyScript Hoàn Chỉnh
local ServerStorage = game:GetService("ServerStorage")
-- Yêu cầu script mô-đun bên dưới ⯆
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
-- Tặng cho người chơi một chìa khóa và hủy phần chìa khóa
-- =============================================
treasureManager.getKey(keyPart, whichCharacter)
-- =============================================
end
end
-- Liên kết mọi phần chìa khóa với hàm chạm để nó hoạt động trên tất cả các phần
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
end

Tóm tắt

Một ứng dụng phổ biến của việc sử dụng các script mô-đun trong các trò chơi Roblox là để xử lý các nhiệm vụ chung mà người chơi sử dụng, chẳng hạn như tặng cho họ điểm. Trong ví dụ này, một script mô-đun có tên là TreasureManager đã được tạo ra để xử lý việc tặng chìa khóa và kho báu cho người chơi mỗi khi họ tương tác với các đối tượng trong trò chơi.

©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.