
Để á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
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.
Trong ServerStorage, tạo một ModuleScript mới và đổi tên thành TreasureManager.

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
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ô-đunreturn TreasureManagerDướ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ô-đunfunction TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagerTrong 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ó.
Mở script chìa khóa trong Workspace ⟩ Keys ⟩ KeyScript.
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.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()Đã 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 keyPart và whichCharacter.
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.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()local function partTouched(otherPart, keyPart)local whichCharacter = otherPart.Parentlocal 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)-- =============================================endendChạ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 = {} và 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.
Trong ServerStorage, mở script TreasureManager.
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ô-đunfunction TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManagerSao 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")endlocal function getPlayerTreasure(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Treasure")end------------------ Các Hàm Mô-đunĐể 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ô-đunfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endChạ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.
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 TreasureManagerLấ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
Đầu tiên trong script TreasureManager ⟩ ServerStorage, 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 = 1local chestPickCost = 1local 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Để 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ô-đunfunction TreasureManager.canOpenChest(whichCharacter)endfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endSao 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 thenreturn trueelsereturn falseendend
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.
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Để 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 - chestPickCostplayerTreasure.Value = playerTreasure.Value + chestRewardchestPart.Parent:Destroy()end
Gọi các hàm rương
Bây giờ mà hai hàm mô-đun, canOpenChest() và 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.
Trong Workspace ⟩ Chests, mở ChestScript.
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ướilocal treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()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.Parentlocal 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)-- =============================================endendTiế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.Parentlocal 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 thentreasureManager.openChest(chestPart, whichCharacter)end-- =============================================endendChạ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
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 TreasureManagerlocal 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)
endlocal 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)
endTó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.