เพื่อใช้ความรู้ของคุณเกี่ยวกับสคริปต์โมดูลให้สร้างสคริปต์โมดูลที่ผู้เล่นสามารถเก็บกุญแจและใช้มันเพื่อเปิดหีบสมบัติ
การตั้งค่าโครงการ
โครงการนี้รวมถึงแผนที่เริ่มต้นด้วยลีดเดอร์บอร์ดและวัตถุเก็บของที่มีสคริปต์สำหรับกุญแจและหีบสมบัติ
โหลดโครงการเริ่มต้น
ใน Roblox Studio, เปิดไฟล์ที่ดาวน์โหลด: คู่มือเกี่ยวกับสคริปต์โมดูล - โครงการเริ่มต้น roblox .
สร้างสคริปโมดูล
ดังนั้นผู้เล่นจึงสามารถรับสมบัติจากหีบได้สร้างสคริปต์โมดูลที่มีชื่อว่า TreasureManager การใช้สคริปต์โมดูลจะเชื่อมต่อการเก็บของและลีดเดอร์บอร์ดด้วยกัน
ใน ServerStorage สร้าง ModuleScript ใหม่และเปลี่ยนชื่อมันเป็น TreasureManager
ใน จัดการสมบัติ เปลี่ยนชื่อโมดูลปกติของโต๊ะโดยการแทนที่ module ด้วย TreasureManager ในทั้งสองสถานที่
local TreasureManager = {}return TreasureManager
ใช้ฟังก์ชันในสคริปต์โมดูล
เพื่อทดสอบว่าระบบทำงานอย่างไรในสคริปต์โมดูล, สร้างระบบใหม่ที่มีชื่อว่า getKey() เมื่อระบบ getKey() ได้รับการโทรจากสคริปต์อื่น, ผู้เล่น
สร้างหน้าต่างโมดูลสำหรับกุญแจ
สคริปต์โมดูลนี้จะใช้คอมบินชั่นของโมดูลและการใช้งานท้องถิ่น, ใส่ความคิดเห็นของ สอง เพื่อช่วยให้คุณเก็บพวกเขาออกจากกัน
local TreasureManager = {}------------------ ฟังก์ชันท้องถิ่น------------------ หน้าที่โมดูลreturn TreasureManagerใต้ความคิดเห็น Module Functions เพิ่มโมดูลใหม่ให้กับ 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 > กุญแจ > 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" .
ตรวจสอบความถูกต้องของข้อความสกริปต์ของโมดูลของคุณในสคริปต์ หากข้อความสกริปต์ของโมดูล เช่น เก็บผู้จัดการสมบัติ ถูกเขียนอย่างผิดปกติจะมีข้อผิดพลาด ปัญหา: รับข้อความผิดพลาดรวมถึง: "attempt to index global" .
ตรวจสอบข้อมูลที่รวมถึงต้องการสำหรับสคริปต์โมดูลใน keyScript จำเป็นต้องมันจะไม่สามารถใช้ฟังก์ชันและตัวแปรจากโมดูลนั้นได้ ปัญหา: สคริปต์ไม่สามารถดำเนินการได้หรือไม่สามารถเก็บกุญแจได้
ในสคริปต์โมดูล, ตรวจสอบให้แน่ใจว่าทุกข้อมูลอยู่ระหว่าง local TreasureManager = {} และ return TreasureManager สายกลับต้องเป็นสายกลับสุดท้ายของโมดูลสคริป
ตรวจสอบว่ามีการใช้งานสองช่องว่างที่จุดสิ้นสุดของบรรทัดด้วย จำเป็นต้อง, เช่นใน WaitForChild("TreasureManager")) .
สร้างฟังก์ชันในท้องถิ่น
ตอนนี้ ตารางจัดอันดับติดตามกุญแจและสมบัติของผู้เล่น เพื่อเปลี่ยนตัวเลขตารางจัดอันดับ ใช้ตัวเลขในโมดูลสคริปต์ท้องถิ่นเท่านั้น ตัวเลขในโมดูลนี้จะใช้ได้เฉพาะในสคริปต์ TreasureManager เ
ใน ServerStorage เปิดสคริปต์ TreasureManager
กำลังติดตาม:
รับบริการผู้เล่นเพื่อให้สคริปต์สามารถทำงานได้กับสถิติลีดเดอร์บอร์ดของผู้เล่น
เก็บจำนวนกุญแจที่ผู้เล่นได้รับหลังจากสัมผัส keyPart
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1------------------ ฟังก์ชันท้องถิ่น------------------ หน้าที่โมดูลfunction TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManagerคัดแนบแฟนคู่นี้ของโค้ดทั้งสองในส่วน หน้าที่บริหารของเรา
getPlayerKeys() รีตรีสัญลักษณ์ผู้นำของผู้เล่น Lockpicks
getPlayerTreasure() ผู้เล่นTreasure
------------------ ฟังก์ชันท้องถิ่น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------------------ Module Functionsเพื่อเพิ่มคีย์ของผู้เล่นในโมดูล getKey() ฟังก์ชัน:
สร้างตัวแปร local เพื่อโทร getPlayerKeys(whichCharacter)
เพิ่มค่าของ keyDrop ให้กับ playerKeys
------------------ หน้าที่โมดูลfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endดำเนินโครงการ ตรวจสอบว่าการแตะต้องปุ่มทำลายมันและเพิ่ม 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
การรับข้อมูลจากสคริปต์โมดูล
สคริปต์โมดูล จัดการสมบัติ จะถูกใช้เมื่อผู้เล่นแตะที่หีบสมบัติเพื่อตรวจสอบว่าพวกเขามีอย่างน้อยหนึ่งกุญแจก่อนเปิดและให้ทอง
ตรวจสอบว่าหีบสามารถเปิดได้หรือไม่
ก่อนใน 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() ด้
------------------ หน้าที่โมดูล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 ที่มีชื่อว่า 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:Destroy()end
เรียกคุณสมบัติห้องเครื่อง
ตอนนี้โครงสร้างสองหน่วยงานจะได้รับการเรียกใช้โดย Chest ส่วนต่างๆ เมื่อผู้เล่นสัมผัสพวกเขาโดยใช้การใช้งานล่วงหน้า canOpenChest() ฟังก์ชัน
ใน พื้นที่ทํางาน > หีบเก็บของ เปิด 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 เป็นจริงหรือไม่.
หากเป็นเช่นนั้น, โทร TreasureManager's openChest() ฟังก์ชัน.
จากนั้นให้ผ่านตัวแปรสองสามตัว: 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ดำเนินโครงการ ตรวจสอบว่า:
- หากคุณมีกุญแจอย่างน้อยหนึ่งกุญแจการแตะที่หีบจะทำลายมันและให้รางวัล
- หากคุณมี 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 ได้รับการสร้างขึ้นเพื่อจัดการการให้คะแนนและสม