
เพื่อใช้ความรู้เกี่ยวกับโมดูลสคริปต์ สร้างโมดูลสคริปต์ที่อนุญาตให้ผู้เล่นเก็บกุญแจและใช้มันเพื่อเปิดหีบสมบัติ
การตั้งค่าโครงการ
โครงการนี้รวมถึงแผนที่เริ่มต้นที่มีลีดเดอร์บอร์ดและวัตถุที่มีสคริปต์สำหรับการเก็บกุญแจและหีบสมบัติ
โหลดโครงการเริ่มต้น
ใน Roblox Studio ให้เปิดไฟล์ที่ดาวน์โหลด: Intro to Module Scripts - Starter Project.rbxl.

สร้างโมดูลสคริปต์
เพื่อให้ผู้เล่นสามารถรับสมบัติจากหีบ สร้างโมดูลสคริปต์ชื่อว่า TreasureManager การใช้โมดูลสคริปต์จะเชื่อมโยงการเก็บและลีดเดอร์บอร์ดเข้าด้วยกัน
ใน ServerStorage สร้าง ModuleScript ใหม่และเปลี่ยนชื่อเป็น TreasureManager.

ใน TreasureManager เปลี่ยนชื่อของตารางโมดูลเริ่มต้นโดยการแทนที่ module ด้วย TreasureManager ในทั้งสองที่
local TreasureManager = {}return TreasureManager
ใช้ฟังก์ชันในโมดูลสคริปต์
เพื่อทดสอบว่าฟังก์ชันทำงานอย่างไรในโมดูลสคริปต์ สร้างฟังก์ชันใหม่ชื่อว่า getKey() เมื่อฟังก์ชัน getKey() ถูกเรียกจากสคริปต์อื่น มันจะได้รับกุญแจเพื่อทำลายและเพิ่ม 1 ให้กับจำนวนกุญแจในคลังของผู้เล่น
สร้างฟังก์ชันโมดูลสำหรับกุญแจ
โมดูลสคริปต์นี้จะใช้การรวมกันของฟังก์ชันโมดูลและฟังก์ชันท้องถิ่น ให้พิมพ์ สอง คอมเมนต์เพื่อช่วยให้คุณแยกแยะพวกมัน
local TreasureManager = {}------------------ ฟังก์ชันท้องถิ่น------------------ ฟังก์ชันโมดูลreturn TreasureManagerใต้คอมเมนต์ ฟังก์ชันโมดูล ให้เพิ่มฟังก์ชันโมดูลใหม่ไปยัง TreasureManager ชื่อว่า getKey().
ใช้พารามิเตอร์สองตัว:
- keyPart - ส่วนที่จะทำลาย
- whichCharacter - ผู้เล่นที่สัมผัสกับส่วนกุญแจ
local TreasureManager = {}------------------ ฟังก์ชันท้องถิ่น------------------ ฟังก์ชันโมดูลfunction TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagerใน getKey() ให้ทำลาย keyPart.
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
ใช้ฟังก์ชันโมดูล
ตอนนี้ ฟังก์ชันโมดูล getKey() สามารถใช้ในสคริปต์อื่นได้ เพื่อทดสอบฟังก์ชันนั้น คุณจะเปิดสคริปต์ที่เตรียมไว้และเรียกมัน
เปิดสคริปต์กุญแจใน Workspace ⟩ Keys ⟩ KeyScript.
ใน keyScript ให้เก็บโมดูลสคริปต์ในตัวแปรชื่อ treasureManager และตั้งค่าให้เท่ากับ: require(ServerStorage:WaitForChild("TreasureManager"))
local ServerStorage = game:GetService("ServerStorage")-- ต้องการโมดูลสคริปต์ด้านล่าง ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()มีฟังก์ชันที่ชื่อว่า partTouched() เพื่อตรวจสอบว่าผู้เล่นสัมผัสกับส่วนหรือไม่ ภายใน partTouched():
- เรียกฟังก์ชันโมดูล getKey() เพื่อทำลายกุญแจ
- ส่ง keyPart และ whichCharacter.
local ServerStorage = game:GetService("ServerStorage")-- ต้องการโมดูลสคริปต์ด้านล่าง ⯆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-- ให้ผู้เล่นกุญแจและทำลายส่วนกุญแจ-- =============================================treasureManager.getKey(keyPart, whichCharacter)-- =============================================endendรันโครงการและตรวจสอบว่าการสัมผัสกุญแจทำให้มันถูกทำลาย
เคล็ดลับการแก้ปัญหา
ปัญหา: ได้รับข้อความแสดงข้อผิดพลาดรวมถึง: "Infinite yield possible".
- ตรวจสอบการสะกดของโมดูลสคริปต์ในสคริปต์ หากโมดูลสคริปต์ เช่น TreasureManager ถูกสะกดแตกต่างออกไป จะมีข้อผิดพลาดเกิดขึ้น
ปัญหา: ได้รับข้อความแสดงข้อผิดพลาดรวมถึง: "attempt to index global".
- ตรวจสอบบรรทัดที่รวมถึงการเรียกใช้โมดูลสคริปต์ใน keyScript หากโมดูลไม่มีการรวม require มันจะไม่สามารถใช้ฟังก์ชันและตัวแปรจากโมดูลสคริปต์นั้นได้
ปัญหา: สคริปต์ไม่ทำงานหรือไม่สามารถเก็บกุญแจได้
ในโมดูลสคริปต์ ให้แน่ใจว่าทุกโค้ดอยู่ระหว่าง local TreasureManager = {} และ return TreasureManager การคืนค่าต้องเป็นบรรทัดสุดท้ายของโค้ดในโมดูลสคริปต์
ตรวจสอบว่ามีวงเล็บสองตัวที่ท้ายบรรทัดที่มี require เช่นใน WaitForChild("TreasureManager")).
สร้างฟังก์ชันท้องถิ่น
ตอนนี้ ลีดเดอร์บอร์ดติดตามกุญแจและสมบัติของผู้เล่น เพื่อเปลี่ยนแปลงตัวเลขในลีดเดอร์บอร์ด ให้ใช้ฟังก์ชันท้องถิ่นในโมดูลสคริปต์ ฟังก์ชันท้องถิ่นจะถูกใช้เพราะการเปลี่ยนแปลงค่ากุญแจหรือสมบัติของผู้เล่นจะต้องใช้เฉพาะในสคริปต์ TreasureManager เท่านั้น ไม่ใช่ที่อื่น
ใน ServerStorage ให้เปิดสคริปต์ TreasureManager.
สร้างตัวแปรท้องถิ่นเพื่อทำสิ่งต่อไปนี้:
รับบริการ Players เพื่อให้สคริปต์สามารถทำงานกับสถิติของลีดเดอร์บอร์ดของผู้เล่น
เก็บจำนวนกุญแจที่ผู้เล่นได้รับหลังจากสัมผัส keyPart.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1------------------ ฟังก์ชันท้องถิ่น------------------ ฟังก์ชันโมดูลfunction TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManagerคัดลอกและวางฟังก์ชันท้องถิ่นสองฟังก์ชันนี้ลงในส่วน ฟังก์ชันท้องถิ่น.
getPlayerKeys() คืนค่าของ Lockpicks leaderstat ของผู้เล่น
getPlayerTreasure() คืนค่าของ Treasure leaderstat ของผู้เล่น
------------------ ฟังก์ชันท้องถิ่น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------------------ ฟังก์ชันโมดูลเพื่อเพิ่มกุญแจให้กับผู้เล่น ในฟังก์ชันโมดูล getKey():
สร้างตัวแปร local เพื่อเรียก getPlayerKeys(whichCharacter).
เพิ่มค่าของ keyDrop ให้กับ playerKeys.
------------------ ฟังก์ชันโมดูลfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endรันโครงการ ตรวจสอบว่าการสัมผัสกุญแจทำให้มันถูกทำลายและเพิ่ม 1 ให้กับกุญแจของผู้เล่นในลีดเดอร์บอร์ด

หากจำเป็น ให้ตรวจสอบสคริปต์ของคุณกับสคริปต์ด้านล่างเพื่อหาปัญหา
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ ฟังก์ชันท้องถิ่น
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
------------------ ฟังก์ชันโมดูล
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManagerรับข้อมูลจากโมดูลสคริปต์
โมดูลสคริปต์ TreasureManager จะถูกใช้เมื่อผู้เล่นสัมผัสหีบสมบัติเพื่อตรวจสอบว่าพวกเขามีกุญแจอย่างน้อยหนึ่งกุญแจก่อนที่จะเปิดมันและให้ทองคำแก่พวกเขา
ตรวจสอบว่าหีบสามารถเปิดได้หรือไม่
ก่อนอื่นใน ServerStorage ⟩ TreasureManager สคริปต์ ให้ตั้งค่าตัวแปรสำหรับจำนวนกุญแจที่ต้องใช้ในการเปิดหีบ และจำนวนทองคำที่แต่ละหีบมี
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1local chestPickCost = 1local chestReward = 100------------------ ฟังก์ชันท้องถิ่นlocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endเพื่อสร้างฟังก์ชันที่ตรวจสอบว่าผู้เล่นสามารถเปิดหีบได้หรือไม่ ในส่วน ฟังก์ชันโมดูล ให้เพิ่มฟังก์ชันใหม่ไปยังตาราง TreasureManager ชื่อว่า canOpenChest() โดยมีพารามิเตอร์ whichCharacter.
------------------ ฟังก์ชันโมดูลfunction TreasureManager.canOpenChest(whichCharacter)endfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endคัดลอกและวางโค้ดด้านล่างลงใน canOpenChest() เพื่อคืนค่า true หากผู้เล่นมีกุญแจเพียงพอ และ false หากพวกเขาไม่มี
function TreasureManager.canOpenChest(whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)if playerKeys.Value >= chestPickCost thenreturn trueelsereturn falseendend
ให้ผู้เล่นสมบัติ
เพื่อให้ผู้เล่นสามารถเปิดหีบได้ สร้างฟังก์ชันใน TreasureManager ที่มอบสมบัติให้กับพวกเขา
เพิ่มฟังก์ชันโมดูลใหม่ไปยัง TreasureManager ชื่อว่า openChest().
ส่งพารามิเตอร์สองตัว:
- chestPart - ส่วนหีบที่จะทำลาย
- whichCharacter - ผู้เล่นที่จะให้สมบัติ
function TreasureManager.openChest(chestPart, whichCharacter)endเพื่อลดกุญแจของผู้เล่นและมอบสมบัติให้พวกเขา คัดลอกและวางโค้ดด้านล่างใน openChest(). โค้ดนี้ใช้ตัวแปรที่สร้างขึ้นก่อนหน้านี้ เช่น chestReward จำนวนสมบัติที่ให้ต่อหีบ
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
เรียกฟังก์ชันหีบ
ตอนนี้ฟังก์ชันโมดูลสองฟังก์ชัน canOpenChest() และ openChest() ได้ถูกสร้างขึ้นแล้ว สามารถเรียกใช้ได้จากส่วนหีบเมื่อใดก็ตามที่ผู้เล่นสัมผัสพวกมันโดยใช้ฟังก์ชัน partTouched() ที่เตรียมไว้
ใน Workspace ⟩ Chests เปิด ChestScript.
สร้างตัวแปรใหม่ชื่อ treasureManager และเรียกใช้โมดูลสคริปต์ TreasureManager ใน ServerStorage.
local ServerStorage = game:GetService("ServerStorage")-- ต้องการโมดูลสคริปต์ด้านล่างlocal treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()ใน partTouched() ใต้คำสั่ง if humanoid สร้างตัวแปรใหม่ชื่อ canOpen และตั้งค่าให้เท่ากับ:
treasureManager.canOpenChest(whichCharacter)
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- ตรวจสอบว่าผู้เล่นสามารถเปิดหีบได้ จากนั้นให้พวกเขาได้รับสมบัติ-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)-- =============================================endendต่อไป สร้างคำสั่ง if เพื่อตรวจสอบว่า canOpen เป็นจริงหรือไม่
หากเป็นเช่นนั้น ให้เรียกฟังก์ชัน openChest() ของ TreasureManager
จากนั้นส่งพารามิเตอร์สองตัว: chestPart หีบที่จะทำลาย และ whichCharacter ผู้เล่นที่จะมอบสมบัติ
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- ตรวจสอบว่าผู้เล่นสามารถเปิดหีบได้ จากนั้นให้พวกเขาได้รับสมบัติ-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)if canOpen == true thentreasureManager.openChest(chestPart, whichCharacter)end-- =============================================endendรันโครงการ ตรวจสอบว่า:
- หากคุณมีกุญแจอย่างน้อย 1 อัน การสัมผัสหีบจะทำลายมันและมอบสมบัติ
- หากคุณมี 0 กุญแจ คุณไม่สามารถเปิดหีบสมบัติได้
เคล็ดลับการแก้ปัญหา
ใน ChestScript ให้แน่ใจว่าฟังก์ชันที่เรียกจากโมดูลสคริปต์ เช่น canOpenChest() ถูกสะกดอย่างถูกต้องตามที่พบในสคริปต์ TreasureManager ความแตกต่างใด ๆ จะทำให้เกิดข้อผิดพลาด
ตรวจสอบว่าฟังก์ชันที่คัดลอกและวาง เช่น treasureManager.openChest() เป็นไปตามที่แสดงในบทเรียน ความแตกต่างใด ๆ อาจทำให้เกิดข้อผิดพลาดเล็กน้อยในสคริปต์
สคริปต์ที่เสร็จสมบูรณ์
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ ฟังก์ชันท้องถิ่น
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
------------------ ฟังก์ชันโมดูล
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")
-- ต้องการโมดูลสคริปต์ด้านล่าง ⯆
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
-- ตรวจสอบว่าผู้เล่นสามารถเปิดหีบได้ จากนั้นให้พวกเขาได้รับสมบัติ
-- =============================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =============================================
end
end
-- ผูกทุกส่วนของหีบเข้ากับฟังก์ชันสัมผัสเพื่อให้ทำงานได้กับทุกส่วน
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")
-- ต้องการโมดูลสคริปต์ด้านล่าง ⯆
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
-- ให้ผู้เล่นกุญแจและทำลายส่วนกุญแจ
-- =============================================
treasureManager.getKey(keyPart, whichCharacter)
-- =============================================
end
end
-- ผูกทุกส่วนของกุญแจเข้ากับฟังก์ชันสัมผัสเพื่อให้ทำงานได้กับทุกส่วน
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
endสรุป
การใช้งานทั่วไปของการใช้โมดูลสคริปต์ในเกม Roblox คือการจัดการงานทั่วไปที่ผู้เล่นใช้ เช่น การมอบคะแนนให้กับพวกเขา สำหรับตัวอย่างนี้ โมดูลสคริปต์ชื่อ TreasureManager ถูกสร้างขึ้นเพื่อจัดการการมอบกุญแจและสมบัติให้กับผู้เล่นเมื่อพวกเขามีปฏิสัมพันธ์กับวัตถุในเกม