สร้างเครื่องจักรสะสมเหรียญ

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


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

สร้างเหรียญ

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

เพื่อสร้างเหรียญ:

  1. ในหน้าต่าง สํารวจ เพิ่มโฟลเดอร์ใหม่ในโฟลเดอร์ โลก จากนั้นเปลี่ยนชื่อใหม่เป็น เหรียญ

  2. ใส่ส่วน ทรงกระบอก ในโฟลเดอร์ เหรียญ จากนั้นเปลี่ยนชื่อส่วนเป็น เหรียญ

    Studio's Explorer window with the Coin part highlighted. The hierarchy of the Workspace to World folder to Coins folder to Coin part is also highlighted.
  3. เลือกส่วนจากนั้นในหน้าต่าง คุณสมบัติ

    • ตั้ง สีอิฐ เป็น ทอง .
    • ตั้ง วัสดุ เป็น โลหะ .
    • ตั้ง ขนาด เป็น 0.6, 8, 4 .
    • ปิดใช้งาน CanCollide สิ่งนี้บอกเครื่องยนต์ว่าส่วนอื่นๆ สามารถผ่านเหรียญได้ ซึ่งหมายความว่าผู้เล่นสามารถเดินผ่านเหรียญเพื่อรวบรวมพวกเขาได้
    • เปิดใช้งาน พิน .สิ่งนี้บอกให้เครื่องยนต์ไม่เปลี่ยนตำแหน่งของเหรียญเนื่องจากการจำลองทางกายภาพที่เกี่ยวข้อง ซึ่งหมายความว่าผู้เล่นสามารถสัมผัสเหรียญได้โดยไม่ส่งผลต่อตำแหน่งของมัน
    A close up view of a gold coin next to two gray cylinder sea stacks on the island.
  4. ทำซ้ำเหรียญไม่กี่เหรียญและวางไว้รอบแผนที่เพื่อการทดสอบ

    Studio's Explorer window with multiple Coin parts highlighted under the Coins folder. A view of multiple coins on the island and two gray cylinder sea stacks.

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

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

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

  1. ในหน้าต่าง สํารวจ เลื่อนเมาส์ไปที่ ServerScriptService และคลิกที่ปุ่ม เมนูบริบทจะแสดงขึ้น

  2. จากเมนูบริบท เลือก สคริปต์ .สคริปต์ใหม่จะแสดงภายใต้ ServerScriptService ซึ่งบอกให้เครื่องยนต์รันสคริปต์บนเซิร์ฟเวอร์และป้องกันไม่ให้ไคลเอนต์เข้าถึงโค้ด

    Studio's Explorer window with both ServerScriptService's plus icon and Script object highlighted.
  3. เปลี่ยนชื่อสคริปต์เป็น CoinService

    Studio's Explorer window with the CoinService script highlighted under ServerScriptService.
  4. รหัส:


    -- การเริ่มต้นบริการและตัวแปร
    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("Player collected coin")
    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 วินาที, และบันทึกการออกมี Player collected coin .

    ส่วนต่อไปอธิบายถึงวิธีที่สคริปทำงานอย่างละเอียดยิ่งขึ้น

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

    เช่นเดียวกับโค้ดจํานวนมากที่คุณอาจเขียนในภาษาอื่น ๆ กำลังติดตาม:

    • รับตัวอย่างบริการ - บริการ 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() กำลังติดตาม:

    • ตรวจสอบว่าเหรียญถูกเปิดใช้งานหรือไม่ - ทุก มีคุณสมบัติ boolean ที่กำหนดว่าวัตถุมีอยู่หรือไม่ในโลก 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("Player collected coin")
      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

ทดสอบกลไก

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

  1. ในแถบเครื่องมือ คลิกปุ่ม เล่น คุณจะเข้าสู่โหมดการทดสอบเล่น Studio

    Play button highlighted in Studio's playtesting options.
  2. ย้ายตัวละครของคุณเพื่อสัมผัสเหรียญหากสคริปต์ทำงานอย่างถูกต้อง หน้าต่าง เอาต์พุต จะแสดง Player collected coin และเหรียญจะหายไปเป็นเวลา 10 วินาทีก่อนที่จะปรากฏอีกครั้ง

    Studio's Output window that displays confirmation that the player collected a coin.