สร้างกลไกการสะสมเหรียญ

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


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

สร้างเหรียญ

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

สร้างเหรียญ

ใน Workspace > World, สร้างโฟลเดอร์ใหม่ชื่อว่า Coins.
ภายในโฟลเดอร์ Coins, สร้าง Part แบบทรงกระบอกชื่อว่า Coin โดยตั้งค่า BrickColor เป็น Gold, Material เป็น Metal, ขนาดเป็น 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 ก่อน ซึ่งประกอบด้วยวัตถุทั้งหมดในโลก 3 มิติ และบริการ Player ซึ่งจัดการและเก็บรวบรวมผู้เล่นทั้งหมดที่เชื่อมต่อกับเกมของคุณ
  • ดึงข้อมูลอ้างอิงไปยังเหรียญทั้งหมด - สคริปต์จะสอบถามที่ทำงาน 3 มิติสำหรับข้อมูลอ้างอิงถึงวัตถุเหรียญทั้งหมดโดยใช้วิธีการ 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 จะจำลองโลก 3 มิติทางกายภาพและจัดการตรรกะมากมายเพื่อจัดการเหตุการณ์ที่เกี่ยวข้องกับการเรนเดอร์ ฟิสิกส์ และเครือข่าย เมื่อต้องการจัดการตรรกะของตัวเองในระหว่างเหตุการณ์เหล่านี้ คุณสามารถฟังและจัดการเหตุการณ์เหล่านี้ได้ในขณะที่ปล่อยให้เอนจินทำสิ่งที่เหลือ ในกรณีนี้คุณฟังและจัดการเหตุการณ์ที่เกี่ยวข้องกับการแตะเหรียญ สคริปต์กำหนดตรรกะสำหรับการจัดการเหตุการณ์นี้ในวิธีการ onCoinTouched() ซึ่งทำสิ่งต่อไปนี้:

  • ตรวจจับว่าเหรียญเปิดใช้งานหรือไม่ - ทุก Instance จะมีคุณสมบัติบูลีน Enabled ที่กำหนดว่าออบเจ็กต์นั้นมีอยู่ในโลก 3 มิติหรือไม่ คุณสามารถเข้าถึงคุณสมบัติของอินสแตนซ์ได้ด้วยวิธีการ GetAttribute()
  • ตรวจจับว่าเล่นสัมผัสเหรียญ - หากเหรียญเปิดใช้งาน วิธีการจะใช้งานบริการผู้เล่นเพื่อตรวจสอบว่าออบเจ็กต์ที่สัมผัสเหรียญคือผู้เล่นจริงหรือไม่ เมื่อตรวจจับเหตุการณ์สัมผัส ฟิสิกส์ของ Roblox จะส่งผ่านออบเจ็กต์ที่สัมผัสเหรียญเป็นพารามิเตอร์ otherPart สคริปต์จะตรวจสอบว่า parent ของ 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

เชื่อมต่อผู้จัดการเหตุการณ์

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

  • วนซ้ำผ่านเหรียญทั้งหมด - วนซ้ำผ่านแต่ละเหรียญโดยใช้การวนซ้ำทั่วไป
  • เชื่อมต่อผู้จัดการกับเหตุการณ์ - ในแต่ละรอบของการวนซ้ำ เหรียญจะเปิดใช้งานตามค่าเริ่มต้น ดังนั้นจะสามารถเห็นได้ในโลก 3 มิติในระหว่างการเริ่มต้นเกม ผู้จัดการ 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 เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ