ตอนนี้ที่คุณมีโลก 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.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10-- กำหนดตัวจัดการเหตุการณ์local function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- ผู้เล่นแตะเหรียญcoin.Transparency = 1coin:SetAttribute("Enabled", false)print("ผู้เล่นสะสมเหรียญแล้ว")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- ตั้งค่าตัวฟังเหตุการณ์for _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end```
ตอนนี้เมื่อใดก็ตามที่ผู้เล่นสัมผัสเหรียญ เหรียญจะหายไปเป็นเวลา 10 วินาที และบันทึกข้อมูลจะพิมพ์ว่า ผู้เล่นสะสมเหรียญแล้ว
ส่วนต่อไปนี้จะอธิบายว่าสคริปต์ทำงานอย่างไรในรายละเอียดมากขึ้น
เริ่มต้นบริการและตัวแปร
เหมือนกับโค้ดส่วนใหญ่ที่คุณอาจเขียนในภาษาอื่น คุณจะต้องกำหนดตัวแปรที่คุณต้องการในลำดับถัดไปที่ด้านบนของสคริปต์ โค้ดของเราทำดังนี้:
- ดึงข้อมูลอ้างอิงไปยังเหรียญทั้งหมด - สคริปต์จะสอบถามที่ทำงาน 3 มิติสำหรับข้อมูลอ้างอิงถึงวัตถุเหรียญทั้งหมดโดยใช้วิธีการ GetChildren() วิธีนี้จะส่งคืนอาร์เรย์ที่ประกอบด้วยทุกอย่างที่ถูกเชื่อมโยงกับวัตถุที่สัมพันธ์กับมัน ซึ่งในกรณีนี้คือโฟลเดอร์ Workspace.World.Coins ที่คุณสร้างขึ้นก่อนหน้านี้
- กำหนดตัวแปรทั่วโลก - ตัวแปร COOLDOWN ใช้ในการกำหนดว่าเหรียญจะถูกปิดใช้งานนานเท่าใดหลังจากที่มันถูกสะสม
เริ่มต้นบริการและตัวแปรlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal 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 วินาที
