การสร้างด้วยโค๊ดโมดูล

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

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

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

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

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

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

  2. ใน Roblox Studio, เปิดไฟล์ที่ดาวน์โหลด: คู่มือเกี่ยวกับสคริปต์โมดูล - โครงการเริ่มต้น roblox .

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

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

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

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


    local TreasureManager = {}
    return TreasureManager

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

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

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

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


    local TreasureManager = {}
    ------------------ ฟังก์ชันท้องถิ่น
    ------------------ หน้าที่โมดูล
    return TreasureManager
  2. ใต้ความคิดเห็น Module Functions เพิ่มโมดูลใหม่ให้กับ 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. เปิดสคริปต์กุญแจใน Workspace > กุญแจ > KeyScript .

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

  • ตรวจสอบความถูกต้องของข้อความสกริปต์ของโมดูลของคุณในสคริปต์ หากข้อความสกริปต์ของโมดูล เช่น เก็บผู้จัดการสมบัติ ถูกเขียนอย่างผิดปกติจะมีข้อผิดพลาด ปัญหา: รับข้อความผิดพลาดรวมถึง: "attempt to index global" .

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

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

  • ตรวจสอบว่ามีการใช้งานสองช่องว่างที่จุดสิ้นสุดของบรรทัดด้วย จำเป็นต้อง, เช่นใน WaitForChild("TreasureManager")) .

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

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

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

  2. กำลังติดตาม:

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

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


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

    • getPlayerKeys() รีตรีสัญลักษณ์ผู้นำของผู้เล่น Lockpicks

    • getPlayerTreasure() ผู้เล่นTreasure


    ------------------ ฟังก์ชันท้องถิ่น
    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. เพื่อเพิ่มคีย์ของผู้เล่นในโมดูล 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 ตารางอันดับ

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

Current TreasureManager Script

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

การรับข้อมูลจากสคริปต์โมดูล

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

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

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


    ------------------ หน้าที่โมดูล
    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

ให้ความร่ํารวยแก่ผู้เล่น

ดังนั้นผู้เล่นจึงสามารถเปิดหีบสมบัติได้, สร้างคุณสมบัติใน เก็บรักษาเหรียญของฉัน ที่ให้รางวัลพวกเขาด้วยเหรียญ.

  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:Destroy()
    end

เรียกคุณสมบัติห้องเครื่อง

ตอนนี้โครงสร้างสองหน่วยงานจะได้รับการเรียกใช้โดย Chest ส่วนต่างๆ เมื่อผู้เล่นสัมผัสพวกเขาโดยใช้การใช้งานล่วงหน้า canOpenChest() ฟังก์ชัน

  1. ใน พื้นที่ทํางาน > หีบเก็บของ เปิด 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 เป็นจริงหรือไม่.

    • หากเป็นเช่นนั้น, โทร TreasureManager's openChest() ฟังก์ชัน.

    • จากนั้นให้ผ่านตัวแปรสองสามตัว: 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. ดำเนินโครงการ ตรวจสอบว่า:

    • หากคุณมีกุญแจอย่างน้อยหนึ่งกุญแจการแตะที่หีบจะทำลายมันและให้รางวัล
    • หากคุณมี 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: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]
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 ได้รับการสร้างขึ้นเพื่อจัดการการให้คะแนนและสม