ตอนนี้ที่คุณมีโลก 3D ส่วนนี้ของบทแนะนำการใช้งานสอนวิธีเพิ่มสคริปต์แรกของคุณเพื่อกำหนดกลไกการรวบรวมเหรียญกลไกนี้ช่วยให้ผู้เล่นสามารถรวบรวมเหรียญได้ และปิดการรวบรวมเหรียญหากมันถูกรวบรวมเมื่อเร็ว ๆ นี้
สร้างเหรียญ
ก่อนที่คุณจะสามารถสคริปต์อะไรได้ คุณต้องมีวัตถุชั่วคราวในโลกเพื่อใช้เป็นเหรียญของคุณเช่นเดียวกับแพลตฟอร์มชั้นวางทะเลที่คุณสร้างในส่วนก่อนหน้านี้ เหรียญสามารถเป็นวัตถุง่ายๆ Part
เพื่อสร้างเหรียญ:
ในหน้าต่าง สํารวจ เพิ่มโฟลเดอร์ใหม่ในโฟลเดอร์ โลก จากนั้นเปลี่ยนชื่อใหม่เป็น เหรียญ
ใส่ส่วน ทรงกระบอก ในโฟลเดอร์ เหรียญ จากนั้นเปลี่ยนชื่อส่วนเป็น เหรียญ
เลือกส่วนจากนั้นในหน้าต่าง คุณสมบัติ
- ตั้ง สีอิฐ เป็น ทอง .
- ตั้ง วัสดุ เป็น โลหะ .
- ตั้ง ขนาด เป็น 0.6, 8, 4 .
- ปิดใช้งาน CanCollide สิ่งนี้บอกเครื่องยนต์ว่าส่วนอื่นๆ สามารถผ่านเหรียญได้ ซึ่งหมายความว่าผู้เล่นสามารถเดินผ่านเหรียญเพื่อรวบรวมพวกเขาได้
- เปิดใช้งาน พิน .สิ่งนี้บอกให้เครื่องยนต์ไม่เปลี่ยนตำแหน่งของเหรียญเนื่องจากการจำลองทางกายภาพที่เกี่ยวข้อง ซึ่งหมายความว่าผู้เล่นสามารถสัมผัสเหรียญได้โดยไม่ส่งผลต่อตำแหน่งของมัน
ทำซ้ำเหรียญไม่กี่เหรียญและวางไว้รอบแผนที่เพื่อการทดสอบ
ชิ้นส่วนทรงกระบอกของคุณตอนนี้ดูเหมือนเหรียญและป้องกันการจำลองฟิสิกส์ แต่คุณต้องเพิ่มโลจิสติกให้กับเหรียญเพื่อให้ผู้เล่นสามารถรวบรวมได้
สร้างสคริปต์
เพื่อให้เหรียญสามารถเก็บได้ คุณต้องตอบสนองต่อผู้เล่นที่สัมผัสมันเครื่องยนต์ Roblox สามารถแจ้งให้คุณทราบเมื่อมีบางอย่างสัมผัสเหรียญ แต่คุณต้องประกาศเรื่องนั้นในสคริปต์เพื่อสร้างสคริปต์:
ในหน้าต่าง สํารวจ เลื่อนเมาส์ไปที่ ServerScriptService และคลิกที่ปุ่ม ⊕ เมนูบริบทจะแสดงขึ้น
จากเมนูบริบท เลือก สคริปต์ .สคริปต์ใหม่จะแสดงภายใต้ ServerScriptService ซึ่งบอกให้เครื่องยนต์รันสคริปต์บนเซิร์ฟเวอร์และป้องกันไม่ให้ไคลเอนต์เข้าถึงโค้ด
เปลี่ยนชื่อสคริปต์เป็น CoinService
รหัส:
-- การเริ่มต้นบริการและตัวแปร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("Player collected coin")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 วินาที, และบันทึกการออกมี Player collected coin .
คําอธิบายโค้ดส่วนต่อไปอธิบายถึงวิธีที่สคริปทำงานอย่างละเอียดยิ่งขึ้น
เริ่มต้นบริการและตัวแปร
เช่นเดียวกับโค้ดจํานวนมากที่คุณอาจเขียนในภาษาอื่น ๆ กำลังติดตาม:
รับการอ้างอิงไปยังเหรียญทั้งหมด - สคริปต์จะค้นหาพื้นที่ทำงาน 3D สำหรับการอ้างอิงไปยังวัตถุเหรียญทั้งหมดด้วยวิธี 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 จำลองโลก 3D ทางกายภาพและจัดการกับเหตุการณ์ที่เกี่ยวข้องกับการแสดงผล ฟิสิกส์ และเครือข่ายมากมายเมื่อคุณสนใจในการสคริปต์โลจิกของคุณเองในระหว่างบางกิจกรรมเหล่านี้ คุณสามารถฟังและจัดการกับพวกเขาได้ในขณะที่ปล่อยให้เครื่องยนต์ทำส่วนที่เหลือในกรณีนี้ คุณฟังและจัดการกิจกรรมที่เกี่ยวข้องกับเหรียญที่ถูกสัมผัสสคริปต์กำหนดโลจิสติกสำหรับจัดการเหตุการณ์นี้ในวิธี onCoinTouched() กำลังติดตาม:
ตรวจสอบว่าเหรียญถูกเปิดใช้งานหรือไม่ - ทุก มีคุณสมบัติ boolean ที่กำหนดว่าวัตถุมีอยู่หรือไม่ในโลก 3Dคุณสามารถรับคุณสมบัติของตัวอย่างด้วยวิธี GetAttribute()
ตรวจสอบว่าผู้เล่นแตะเหรียญหรือไม่ - หากเหรียญถูกเปิดใช้งาน วิธีการจะใช้บริการผู้เล่นเพื่อตรวจสอบว่าวัตถุที่แตะเหรียญเป็นผู้เล่นจริงๆเมื่อเกิดเหตุการสัมผัสขึ้น เครื่อง Roblox จะส่งวัตถุที่สัมผัสเหรียญเป็นพารามิเตอร์ otherPartสคริปต์ตรวจสอบเพื่อดูว่าพ่อของ otherPart เป็นของผู้เล่นหรือไม่
ปิดการใช้งานเหรียญหากผู้เล่นสัมผัสมันและเปิดใช้งานใหม่อีกครั้งหลังจาก 10 วินาที - ในที่สุดหากผู้เล่นสัมผัสเหรียญวิธีจะปิดการใช้งานเหรียญรอ 10 วินาทีแล้วเปิดใช้งานเหรียญอีกครั้งเพื่อเก็บรวบรวมtask.wait() ถูกใช้แทน wait() เนื่องจากมันให้ประสิทธิภาพที่ดีกว่าโดยไม่หยุดการดำเนินการโค้ดทั้งหมด ทำให้สามารถดำเนินการภารกิจในเธรดอื่นได้พร้อมกัน
การกำหนดตัวจัดการเหตุการณ์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("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend
เชื่อมต่อตัวจัดการเหตุการณ์
วัตถุ 3D จำลองทั้งหมดที่มีมาจาก BasePart และดังนั้นจึงมีเหตุการณ์ Touched()ลูปต่อไปนี้เชื่อมต่อตัวจัดการ onTouchedEvent() กำลังติดตาม:
เล่นซ้ำผ่านเหรียญทั้งหมด - เล่นซ้ำผ่านแต่ละเหรียญโดยใช้การเล่นซ้ำทั่วไป
เชื่อมต่อตัวจัดการกับเหตุการณ์ - ในแต่ละรอบของลูป, เหรียญจะเปิดใช้งานโดยค่าเริ่มต้น, ดังนั้นจึงสามารถมองเห็นได้ในโลก 3D ในระหว่างการเริ่มต้นครั้งแรกของประสบการณ์วิธีการจัดการ onCoinTouched() ยังเชื่อมต่อกับเหตุการณ์ Touched ของเหรียญเพื่อให้เกิดขึ้นทุกครั้งที่เกิดเหตุการณ์เมื่อเครื่องตรวจพบการสัมผัส มันยังส่งวัตถุที่สัมผัสวัตถุด้วย otherPart
เชื่อมต่อตัวจัดการอีเวนต์for _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end
ทดสอบกลไก
ถึงเวลาที่จะดูว่ากลไกการรวบรวมเหรียญทำงานตามที่ตั้งใจไว้หรือไม่ เพื่อทดสอบประสบการณ์ของคุณ:
ในแถบเครื่องมือ คลิกปุ่ม เล่น คุณจะเข้าสู่โหมดการทดสอบเล่น Studio
ย้ายตัวละครของคุณเพื่อสัมผัสเหรียญหากสคริปต์ทำงานอย่างถูกต้อง หน้าต่าง เอาต์พุต จะแสดง Player collected coin และเหรียญจะหายไปเป็นเวลา 10 วินาทีก่อนที่จะปรากฏอีกครั้ง