สร้างด้วยโมดูลสคริปต์

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

เพื่อใช้ความรู้เกี่ยวกับโมดูลสคริปต์ สร้างโมดูลสคริปต์ที่อนุญาตให้ผู้เล่นเก็บกุญแจและใช้มันเพื่อเปิดหีบสมบัติ

การตั้งค่าโครงการ

โครงการนี้รวมถึงแผนที่เริ่มต้นที่มีลีดเดอร์บอร์ดและวัตถุที่มีสคริปต์สำหรับการเก็บกุญแจและหีบสมบัติ

โหลดโครงการเริ่มต้น

  1. ดาวน์โหลดโครงการเริ่มต้น

  2. ใน Roblox Studio ให้เปิดไฟล์ที่ดาวน์โหลด: Intro to Module Scripts - Starter Project.rbxl.

สร้างโมดูลสคริปต์

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

  1. ใน ServerStorage สร้าง ModuleScript ใหม่และเปลี่ยนชื่อเป็น TreasureManager.

  2. ใน TreasureManager เปลี่ยนชื่อของตารางโมดูลเริ่มต้นโดยการแทนที่ module ด้วย TreasureManager ในทั้งสองที่

    local TreasureManager = {}
    return TreasureManager

ใช้ฟังก์ชันในโมดูลสคริปต์

เพื่อทดสอบว่าฟังก์ชันทำงานอย่างไรในโมดูลสคริปต์ สร้างฟังก์ชันใหม่ชื่อว่า getKey() เมื่อฟังก์ชัน getKey() ถูกเรียกจากสคริปต์อื่น มันจะได้รับกุญแจเพื่อทำลายและเพิ่ม 1 ให้กับจำนวนกุญแจในคลังของผู้เล่น

สร้างฟังก์ชันโมดูลสำหรับกุญแจ

  1. โมดูลสคริปต์นี้จะใช้การรวมกันของฟังก์ชันโมดูลและฟังก์ชันท้องถิ่น ให้พิมพ์ สอง คอมเมนต์เพื่อช่วยให้คุณแยกแยะพวกมัน

    local TreasureManager = {}
    ------------------ ฟังก์ชันท้องถิ่น
    ------------------ ฟังก์ชันโมดูล
    return TreasureManager
  2. ใต้คอมเมนต์ ฟังก์ชันโมดูล ให้เพิ่มฟังก์ชันโมดูลใหม่ไปยัง TreasureManager ชื่อว่า getKey().

    ใช้พารามิเตอร์สองตัว:

    • keyPart - ส่วนที่จะทำลาย
    • whichCharacter - ผู้เล่นที่สัมผัสกับส่วนกุญแจ
    local TreasureManager = {}
    ------------------ ฟังก์ชันท้องถิ่น
    ------------------ ฟังก์ชันโมดูล
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. ใน getKey() ให้ทำลาย keyPart.

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

ใช้ฟังก์ชันโมดูล

ตอนนี้ ฟังก์ชันโมดูล getKey() สามารถใช้ในสคริปต์อื่นได้ เพื่อทดสอบฟังก์ชันนั้น คุณจะเปิดสคริปต์ที่เตรียมไว้และเรียกมัน

  1. เปิดสคริปต์กุญแจใน WorkspaceKeysKeyScript.

  2. ใน keyScript ให้เก็บโมดูลสคริปต์ในตัวแปรชื่อ treasureManager และตั้งค่าให้เท่ากับ: require(ServerStorage:WaitForChild("TreasureManager"))

    local ServerStorage = game:GetService("ServerStorage")
    -- ต้องการโมดูลสคริปต์ด้านล่าง ⯆
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. มีฟังก์ชันที่ชื่อว่า partTouched() เพื่อตรวจสอบว่าผู้เล่นสัมผัสกับส่วนหรือไม่ ภายใน partTouched():

    • เรียกฟังก์ชันโมดูล getKey() เพื่อทำลายกุญแจ
    • ส่ง keyPart และ whichCharacter.
    local 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
  4. รันโครงการและตรวจสอบว่าการสัมผัสกุญแจทำให้มันถูกทำลาย

เคล็ดลับการแก้ปัญหา

ปัญหา: ได้รับข้อความแสดงข้อผิดพลาดรวมถึง: "Infinite yield possible".

  • ตรวจสอบการสะกดของโมดูลสคริปต์ในสคริปต์ หากโมดูลสคริปต์ เช่น TreasureManager ถูกสะกดแตกต่างออกไป จะมีข้อผิดพลาดเกิดขึ้น

ปัญหา: ได้รับข้อความแสดงข้อผิดพลาดรวมถึง: "attempt to index global".

  • ตรวจสอบบรรทัดที่รวมถึงการเรียกใช้โมดูลสคริปต์ใน keyScript หากโมดูลไม่มีการรวม require มันจะไม่สามารถใช้ฟังก์ชันและตัวแปรจากโมดูลสคริปต์นั้นได้

ปัญหา: สคริปต์ไม่ทำงานหรือไม่สามารถเก็บกุญแจได้

  • ในโมดูลสคริปต์ ให้แน่ใจว่าทุกโค้ดอยู่ระหว่าง local TreasureManager = {} และ return TreasureManager การคืนค่าต้องเป็นบรรทัดสุดท้ายของโค้ดในโมดูลสคริปต์

  • ตรวจสอบว่ามีวงเล็บสองตัวที่ท้ายบรรทัดที่มี require เช่นใน WaitForChild("TreasureManager")).

สร้างฟังก์ชันท้องถิ่น

ตอนนี้ ลีดเดอร์บอร์ดติดตามกุญแจและสมบัติของผู้เล่น เพื่อเปลี่ยนแปลงตัวเลขในลีดเดอร์บอร์ด ให้ใช้ฟังก์ชันท้องถิ่นในโมดูลสคริปต์ ฟังก์ชันท้องถิ่นจะถูกใช้เพราะการเปลี่ยนแปลงค่ากุญแจหรือสมบัติของผู้เล่นจะต้องใช้เฉพาะในสคริปต์ TreasureManager เท่านั้น ไม่ใช่ที่อื่น

  1. ใน ServerStorage ให้เปิดสคริปต์ TreasureManager.

  2. สร้างตัวแปรท้องถิ่นเพื่อทำสิ่งต่อไปนี้:

    • รับบริการ Players เพื่อให้สคริปต์สามารถทำงานกับสถิติของลีดเดอร์บอร์ดของผู้เล่น

    • เก็บจำนวนกุญแจที่ผู้เล่นได้รับหลังจากสัมผัส keyPart.

    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    ------------------ ฟังก์ชันท้องถิ่น
    ------------------ ฟังก์ชันโมดูล
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. คัดลอกและวางฟังก์ชันท้องถิ่นสองฟังก์ชันนี้ลงในส่วน ฟังก์ชันท้องถิ่น.

    • getPlayerKeys() คืนค่าของ Lockpicks leaderstat ของผู้เล่น

    • getPlayerTreasure() คืนค่าของ Treasure leaderstat ของผู้เล่น

    ------------------ ฟังก์ชันท้องถิ่น
    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
    ------------------ ฟังก์ชันโมดูล
  4. เพื่อเพิ่มกุญแจให้กับผู้เล่น ในฟังก์ชันโมดูล getKey():

    • สร้างตัวแปร local เพื่อเรียก getPlayerKeys(whichCharacter).

    • เพิ่มค่าของ keyDrop ให้กับ playerKeys.

    ------------------ ฟังก์ชันโมดูล
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. รันโครงการ ตรวจสอบว่าการสัมผัสกุญแจทำให้มันถูกทำลายและเพิ่ม 1 ให้กับกุญแจของผู้เล่นในลีดเดอร์บอร์ด

หากจำเป็น ให้ตรวจสอบสคริปต์ของคุณกับสคริปต์ด้านล่างเพื่อหาปัญหา

สคริปต์ TreasureManager ปัจจุบัน
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 จะถูกใช้เมื่อผู้เล่นสัมผัสหีบสมบัติเพื่อตรวจสอบว่าพวกเขามีกุญแจอย่างน้อยหนึ่งกุญแจก่อนที่จะเปิดมันและให้ทองคำแก่พวกเขา

ตรวจสอบว่าหีบสามารถเปิดได้หรือไม่

  1. ก่อนอื่นใน ServerStorageTreasureManager สคริปต์ ให้ตั้งค่าตัวแปรสำหรับจำนวนกุญแจที่ต้องใช้ในการเปิดหีบ และจำนวนทองคำที่แต่ละหีบมี

    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
  2. เพื่อสร้างฟังก์ชันที่ตรวจสอบว่าผู้เล่นสามารถเปิดหีบได้หรือไม่ ในส่วน ฟังก์ชันโมดูล ให้เพิ่มฟังก์ชันใหม่ไปยังตาราง TreasureManager ชื่อว่า canOpenChest() โดยมีพารามิเตอร์ whichCharacter.

    ------------------ ฟังก์ชันโมดูล
    function TreasureManager.canOpenChest(whichCharacter)
    end
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  3. คัดลอกและวางโค้ดด้านล่างลงใน canOpenChest() เพื่อคืนค่า true หากผู้เล่นมีกุญแจเพียงพอ และ false หากพวกเขาไม่มี

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

ให้ผู้เล่นสมบัติ

เพื่อให้ผู้เล่นสามารถเปิดหีบได้ สร้างฟังก์ชันใน TreasureManager ที่มอบสมบัติให้กับพวกเขา

  1. เพิ่มฟังก์ชันโมดูลใหม่ไปยัง TreasureManager ชื่อว่า openChest().

    ส่งพารามิเตอร์สองตัว:

    • chestPart - ส่วนหีบที่จะทำลาย
    • whichCharacter - ผู้เล่นที่จะให้สมบัติ
    function TreasureManager.openChest(chestPart, whichCharacter)
    end
  2. เพื่อลดกุญแจของผู้เล่นและมอบสมบัติให้พวกเขา คัดลอกและวางโค้ดด้านล่างใน openChest(). โค้ดนี้ใช้ตัวแปรที่สร้างขึ้นก่อนหน้านี้ เช่น chestReward จำนวนสมบัติที่ให้ต่อหีบ

    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

เรียกฟังก์ชันหีบ

ตอนนี้ฟังก์ชันโมดูลสองฟังก์ชัน canOpenChest() และ openChest() ได้ถูกสร้างขึ้นแล้ว สามารถเรียกใช้ได้จากส่วนหีบเมื่อใดก็ตามที่ผู้เล่นสัมผัสพวกมันโดยใช้ฟังก์ชัน partTouched() ที่เตรียมไว้

  1. ใน WorkspaceChests เปิด ChestScript.

  2. สร้างตัวแปรใหม่ชื่อ treasureManager และเรียกใช้โมดูลสคริปต์ TreasureManager ใน ServerStorage.

    local ServerStorage = game:GetService("ServerStorage")
    -- ต้องการโมดูลสคริปต์ด้านล่าง
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. ใน partTouched() ใต้คำสั่ง if humanoid สร้างตัวแปรใหม่ชื่อ canOpen และตั้งค่าให้เท่ากับ:

    treasureManager.canOpenChest(whichCharacter)

    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- ตรวจสอบว่าผู้เล่นสามารถเปิดหีบได้ จากนั้นให้พวกเขาได้รับสมบัติ
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    -- =============================================
    end
    end
  4. ต่อไป สร้างคำสั่ง if เพื่อตรวจสอบว่า canOpen เป็นจริงหรือไม่

    • หากเป็นเช่นนั้น ให้เรียกฟังก์ชัน openChest() ของ TreasureManager

    • จากนั้นส่งพารามิเตอร์สองตัว: chestPart หีบที่จะทำลาย และ whichCharacter ผู้เล่นที่จะมอบสมบัติ

    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
  5. รันโครงการ ตรวจสอบว่า:

    • หากคุณมีกุญแจอย่างน้อย 1 อัน การสัมผัสหีบจะทำลายมันและมอบสมบัติ
    • หากคุณมี 0 กุญแจ คุณไม่สามารถเปิดหีบสมบัติได้

เคล็ดลับการแก้ปัญหา

  • ใน ChestScript ให้แน่ใจว่าฟังก์ชันที่เรียกจากโมดูลสคริปต์ เช่น canOpenChest() ถูกสะกดอย่างถูกต้องตามที่พบในสคริปต์ TreasureManager ความแตกต่างใด ๆ จะทำให้เกิดข้อผิดพลาด

  • ตรวจสอบว่าฟังก์ชันที่คัดลอกและวาง เช่น treasureManager.openChest() เป็นไปตามที่แสดงในบทเรียน ความแตกต่างใด ๆ อาจทำให้เกิดข้อผิดพลาดเล็กน้อยในสคริปต์

สคริปต์ที่เสร็จสมบูรณ์

สคริปต์ TreasureManager ที่เสร็จสมบูรณ์
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 TreasureManager
สคริปต์ ChestScript ที่เสร็จสมบูรณ์
local 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)
end
สคริปต์ keyScript ที่เสร็จสมบูรณ์
local 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 ถูกสร้างขึ้นเพื่อจัดการการมอบกุญแจและสมบัติให้กับผู้เล่นเมื่อพวกเขามีปฏิสัมพันธ์กับวัตถุในเกม

©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ