สร้างกลไกการเก็บเหรียญ

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


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

สร้างเหรียญ

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

สร้างเหรียญ
ใน Workspace > World, สร้างโฟลเดอร์ใหม่ชื่อ Coins.
ภายในโฟลเดอร์ Coins, สร้าง Part ทรงกระบอกชื่อ Coin โดยตั้งค่า BrickColor เป็น Gold, Material เป็น Metal, Size เป็น 0.6, 8, 4, และ Orientation เป็น 90, 0, 0.
ปิด CanCollide และเปิดใช้งาน Anchored.
จากนั้นทำสำเนา Coin หลายครั้งและกระจายสำเนาไปรอบๆ เกาะและบนแพลตฟอร์มเพื่อให้สามารถเข้าถึงได้จากระดับทะเล.
ให้แต่ละสำเนาชื่อว่า Coin.

สร้างสคริปต์

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

สร้าง CoinService
ใน ServerScriptService, สร้าง Script ชื่อ CoinService ด้วยโค้ดต่อไปนี้:
```lua
-- การเริ่มต้นบริการและตัวแปร
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
-- การกำหนดตัวจัดการเหตุการณ์
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- ผู้เล่นสัมผัสเหรียญ
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("ผู้เล่นเก็บเหรียญ")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
-- การตั้งค่าตัวฟังเหตุการณ์
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
```

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

ส่วนต่อไปนี้อธิบายวิธีการทำงานของสคริปต์ในรายละเอียดเพิ่มเติม

เริ่มต้นบริการและตัวแปร

เหมือนกับโค้ดมากมายที่คุณอาจเขียนในภาษาอื่น คุณจะกำหนดตัวแปรที่คุณต้องการในภายหลังที่ด้านบนของสคริปต์ โค้ดของเราทำดังนี้:

  • รับอินสแตนซ์บริการ - บริการ Roblox ให้ฟังก์ชันการทำงานที่สร้างขึ้นสำหรับฟีเจอร์ทั่วไป สคริปต์จะได้รับอินสแตนซ์ของบริการ Workspace ซึ่งประกอบด้วยวัตถุทั้งหมดในโลก 3D และบริการ Player ซึ่งจัดการและเก็บผู้เล่นทั้งหมดที่เชื่อมต่อกับเกมของคุณ
  • รับการอ้างอิงถึงเหรียญทั้งหมด - สคริปต์จะสอบถามพื้นที่ทำงาน 3D สำหรับการอ้างอิงทั้งหมดไปยังวัตถุเหรียญด้วยวิธี GetChildren() วิธีนี้จะส่งคืนอาร์เรย์ที่ประกอบด้วยทุกอย่างที่เป็นบิดาของวัตถุที่เกี่ยวข้อง ซึ่งในกรณีนี้คือโฟลเดอร์ Workspace.World.Coins ที่คุณสร้างขึ้นก่อนหน้านี้
  • กำหนดตัวแปรทั่วโลก - ตัวแปร COOLDOWN จะถูกใช้ในภายหลังเพื่อกำหนดระยะเวลาที่จะปิดการใช้งานเหรียญหลังจากที่มันถูกเก็บไปแล้ว
การเริ่มต้นบริการและตัวแปร
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
...

กำหนดตัวจัดการเหตุการณ์

เอนจิน Roblox จำลองโลก 3D ทางกายภาพและจัดการตรรกะมากมายเพื่อจัดการเหตุการณ์ที่เกี่ยวข้องกับการเรนเดอร์ ฟิสิกส์ และเครือข่าย เมื่อคุณสนใจในการเขียนตรรกะของคุณเองในระหว่างเหตุการณ์เหล่านี้ คุณสามารถฟังและจัดการกับพวกเขา ในขณะที่ปล่อยให้เอนจินทำส่วนที่เหลือ ในกรณีนี้ คุณฟังและจัดการกับเหตุการณ์ที่เกี่ยวข้องกับการสัมผัสเหรียญ สคริปต์กำหนดตรรกะสำหรับการจัดการเหตุการณ์นี้ในวิธี onCoinTouched() ซึ่งทำดังนี้:

  • ตรวจจับว่าเหรียญเปิดใช้งานอยู่หรือไม่ - ทุก Instance มีคุณสมบัติ boolean Enabled ที่กำหนดว่าออบเจ็กต์นั้นมีอยู่ในโลก 3D หรือไม่ คุณสามารถรับคุณสมบัติของอินสแตนซ์ได้ด้วยวิธี GetAttribute()
  • ตรวจจับว่าผู้เล่นสัมผัสเหรียญหรือไม่ - หากเหรียญเปิดใช้งาน วิธีนี้จะใช้บริการผู้เล่นเพื่อตรวจสอบว่าวัตถุที่สัมผัสเหรียญนั้นเป็นผู้เล่นจริงหรือไม่ เมื่อเกิดเหตุการณ์สัมผัส เอนจิน Roblox จะส่งวัตถุที่สัมผัสเหรียญเป็นพารามิเตอร์ otherPart สคริปต์จะตรวจสอบว่าแม่ของ otherPart เป็นของผู้เล่นหรือไม่
  • ปิดการใช้งานเหรียญหากผู้เล่นสัมผัสมัน และเปิดใช้งานอีกครั้งหลังจาก 10 วินาที - สุดท้าย หากผู้เล่นสัมผัสเหรียญ วิธีนี้จะปิดการใช้งานเหรียญ รอ 10 วินาที และจากนั้นเปิดใช้งานเหรียญอีกครั้งเพื่อให้เก็บได้ task.wait() ถูกใช้แทน wait() เพราะมันให้ประสิทธิภาพที่ดีกว่าโดยไม่หยุดการดำเนินการของโค้ดทั้งหมด ทำให้สามารถทำงานในเธรดอื่นๆ ทำงานพร้อมกันได้
การกำหนดตัวจัดการเหตุการณ์
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- ผู้เล่นสัมผัสเหรียญ
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("ผู้เล่นเก็บเหรียญ")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end

เชื่อมต่อกับตัวจัดการเหตุการณ์

วัตถุ 3D ที่จำลองทั้งหมดสืบทอดมาจาก BasePart และดังนั้นจึงมีเหตุการณ์ Touched() ดังนั้นลูปต่อไปนี้จึงเชื่อมต่อ onTouchedEvent() ตัวจัดการกับเหตุการณ์สัมผัสของเหรียญแต่ละเหรียญโดยทำดังนี้:

  • ลูปผ่านเหรียญทั้งหมด - ลูปผ่านเหรียญแต่ละเหรียญโดยใช้การวนซ้ำทั่วไป
  • เชื่อมต่อกับเหตุการณ์ - ในแต่ละรอบของลูป เหรียญจะเปิดใช้งานโดยค่าเริ่มต้น ดังนั้นจึงมองเห็นได้ในโลก 3D ในระหว่างการเริ่มต้นเกม วิธีจัดการ onCoinTouched() ยังเชื่อมต่อกับเหตุการณ์ Touched ของเหรียญเพื่อให้มันทำงานทุกครั้งที่เกิดเหตุการณ์ เมื่อเอนจินตรวจจับการสัมผัส มันจะส่งวัตถุที่สัมผัสวัตถุ otherPart ด้วย
การเชื่อมต่อกับตัวจัดการเหตุการณ์
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end

ทดสอบกลไก

เลือก Test จากเมนูดรอปดาวน์และคลิก Play ย้ายตัวละครของคุณไปสัมผัสเหรียญ หากทุกอย่างทำงานได้ เหรียญจะหายไป หน้าต่าง Output จะแสดงว่า ผู้เล่นเก็บเหรียญ และเหรียญจะปรากฏอีกครั้งหลังจาก 10 วินาที

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