สร้างการเก็บสุขภาพ

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

ในระหว่างบทแนะนำการเขียนสคริปต์พื้นฐาน คุณได้เขียนส่วนต่างๆ เพื่อสร้างฉากที่เล่นได้ด้วยวิธีการก่อนหน้านี้หากคุณทำซ้ำชิ้นส่วนคุณจะมีสคริปต์ซ้ำด้วยจะทำให้การอัปเดตสคริปต์น่าเบื่อเนื่องจากต้องทำการเปลี่ยนแปลงสคริปต์โดยสคริปต์

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

ตั้งค่า

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

Edit in Studio option from the experience's main page

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

ฟื้นฟูสุขภาพ

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

  1. ใน ServerScriptService เพิ่มสคริปต์ที่ชื่อว่า PickupManager

  2. ในสคริปต์นี้ ประกาศคงที่ที่เรียกว่า MAX_HEALTH ด้วยค่า 100

  3. สร้างฟังก์ชันที่เรียกว่า onTouchHealthPickup ด้วยพารามิเตอร์สำหรับส่วนอื่นที่สัมผัสการเก็บและตัวเก็บเอง


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. ในฟังก์ชัน รับโมเดลตัวละครจากพ่อของ otherPart ต่อไปตรวจสอบว่ามี Humanoid โดยใช้ FindFirstChildWhichIsA() หรือไม่

  5. หากมีมนุษย์ ตั้งค่าคุณสมบัติ สุขภาพ ของพวกเขาเป็น MAX_HEALTH


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

รับโฟลเดอร์การรับส่ง

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

เมื่อเรียกในไดเรกทอรี ฟังก์ชัน GetChildren จะส่งคืนคอลเลกชันของเนื้อหาในไดเรกทอรี

  1. ใต้ MAX_HEALTH ประกาศตัวแปรชื่อ healthPickupsFolder และใช้ฟังก์ชัน WaitForChild เพื่อรับโฟลเดอร์ HealthPickups จากพื้นที่ทำงาน

  2. สร้างตัวแปรชื่อ healthPickups เพื่อเก็บผลการเรียกใช้ฟังก์ชัน GetChildren บน healthPickupsFolder


    local MAX_HEALTH = 100
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
    local healthPickups = healthPickupsFolder:GetChildren()
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

ซ้ำกับ ipairs

onTouchHealthPickup จำเป็นต้องเรียกสำหรับการเก็บสุขภาพแต่ละครั้งในอาร์เรย์ เพื่อทำเช่นนี้อย่างมีประสิทธิภาพจะใช้ภาษาซิกแลนด์ใหม่

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

  • ดัชนี : นี่เทียบเท่ากับตัวแปรควบคุมในลูปปกติ
  • ค่า : จะถูกเติมด้วยแต่ละองค์ประกอบในคอลเลกชันในขณะที่ลูปซ้ำเป็นความคิดที่ดีที่จะตั้งชื่อตัวแปรค่าหลังจากสิ่งที่จะมีจริงๆ
  • รายการ : รายการที่คุณต้องการจะเรียกซ้ำถูกส่งไปยังฟังก์ชัน ipairs

ในรหัสต่อไปนี้คุณไม่ต้องการดัชนีสำหรับอะไร ดังนั้นจึงสามารถปล่อยให้ว่างเปล่าด้วย _สร้างลูป สําหรับ โดยใช้ฟังก์ชัน ipairs โดยส่ง healthPickups


local function onTouchHealthPickup(otherPart, healthPickup)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
end
end
for _, healthPickup in ipairs(healthPickups) do
end

ฟังก์ชันบรรจุภัณฑ์จะต้องใช้เพื่อส่งการเก็บสุขภาพไปยังฟังก์ชัน onTouchHealthPickup เมื่อเชื่อมต่อกับอีเวนต์ Touched

  1. ในลูป for เชื่อมต่ออีเวนต์ที่สัมผัสกับฟังก์ชันที่ไม่ระบุชื่อด้วยพารามิเตอร์ชื่อ otherPart

  2. เรียกฟังก์ชัน onTouchHealthPickups โดยส่งพารามิเตอร์ทั้ง otherPart และ healthPickup


    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

ทดสอบโค้ดของคุณตอนนี้และคุณควรพบว่าการเก็บสุขภาพจะฟื้นฟูสุขภาพของคุณคุณจะต้องทำลายผู้เล่นของคุณก่อน - ลองยืนบนช่องระบายอากาศที่อยู่ติดกับจุดเกิด

แถบสุขภาพควรปรากฏในด้านบนขวาซึ่งจะหายไปเมื่อผู้เล่นได้รับการรักษา

ระยะเวลาคูลดาวน์การรับ

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

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

  1. ในลูป for ตั้งค่าคุณสมบัติใหม่ **** ที่เรียกว่า "Enabled" เป็น true

  2. ห่อโค้ดไว้ภายใน onTouchHealthPickup ในคำสั่งหากมีเงื่อนไข healthPickup:GetAttribute("Enabled")


    local function onTouchHealthPickup(otherPart, healthPickup)
    if healthPickup:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end
    end
    for _, healthPickup in ipairs(healthPickups) do
    healthPickup:SetAttribute("Enabled", true)
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

ปิดการรับ

การรับควรให้ข้อเสนอแนะทางภาพว่าถูกปิดใช้งาน - วิธีทั่วไปในการระบุนี้คือทำให้มันโปร่งใสเล็กน้อย

  1. ประกาศสามคงที่ที่ด้านบนของสคริปต์ (รู้สึกอิสระที่จะปรับแต่งแต่ละค่าตามที่คุณต้องการ):

    • ENABLED_TRANSPARENCY = 0.4
    • DISABLED_TRANSPARENCY = 0.9
    • COOLDOWN = 10

    local MAX_HEALTH = 100
    local ENABLED_TRANSPARENCY = 0.4
    local DISABLED_TRANSPARENCY = 0.9
    local COOLDOWN = 10
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
  2. ในคำสั่ง if ใน onTouchHealthPickup , ตั้งค่า Transparency ของการรับเป็น DISABLED_TRANSPARENCY และค่าขององค์ประกอบ Enabled เป็น false


    local function onTouchHealthPickup(otherPart, healthPickup)
    if healthPickup:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    healthPickup.Transparency = DISABLED_TRANSPARENCY
    healthPickup:SetAttribute("Enabled", false)
    end
    end
    end
  3. เรียกฟังก์ชัน task.wait() โดยส่ง COOLDOWN เป็นจำนวนที่ต้องรอ

  4. ตั้ง Transparency กลับเป็น ENABLED_TRANSPARENCY และ Enabled กลับเป็น true


    local function onTouchHealthPickup(otherPart, healthPickup)
    if healthPickup:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    healthPickup.Transparency = DISABLED_TRANSPARENCY
    healthPickup:SetAttribute("Enabled", false)
    task.wait(COOLDOWN)
    healthPickup.Transparency = ENABLED_TRANSPARENCY
    healthPickup:SetAttribute("Enabled", true)
    end
    end
    end

ทดสอบการรับของคุณอีกครั้ง: คุณควรพบว่าเมื่อคุณสัมผัสการรับ มันจะฟื้นฟูสุขภาพของคุณให้กลับมาโปร่งใสแล้วกลับมาพร้อมใช้งานอีกครั้ง

หากต้องการทำให้ความคิดเห็นมีผลมากขึ้นสำหรับผู้เล่นเมื่อเก็บขึ้นมา ลองตัดความสว่างของจุดแสงในการเก็บขึ้นเมื่อคุณเปลี่ยนความโปร่งใส

ลองใช้การรับสุขภาพเหล่านี้ในโครงการของคุณเอง หรือเปลี่ยนรูปลักษณ์และผลกระทบเพื่อให้พลังงานชนิดอื่นแก่ผู้เล่นของคุณ

รหัสสุดท้าย


local MAX_HEALTH = 100
local ENABLED_TRANSPARENCY = 0.4
local DISABLED_TRANSPARENCY = 0.9
local COOLDOWN = 10
local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
local healthPickups = healthPickupsFolder:GetChildren()
local function onTouchHealthPickup(otherPart, healthPickup)
if healthPickup:GetAttribute("Enabled") then
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
healthPickup.Transparency = DISABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", false)
task.wait(COOLDOWN)
healthPickup.Transparency = ENABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", true)
end
end
end
for _, healthPickup in ipairs(healthPickups) do
healthPickup:SetAttribute("Enabled", true)
healthPickup.Touched:Connect(function(otherPart)
onTouchHealthPickup(otherPart, healthPickup)
end)
end