คู่มือการใช้งานระดับกลาง

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

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

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

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

ตั้งค่า

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

ตัวเลือกแก้ไขใน Studio จากหน้าหลักของประสบการณ์

การเก็บสุขภาพแต่ละชิ้นเป็นการรวมกันของชิ้นส่วนสี่เหลี่ยมผืนผ้าสองชิ้นโดยมีจุดไฟสีเขียวอยู่ภายใน ทั้งหมดถูกจัดเก็บในโฟลเดอร์เดียวใน Workspace ที่ชื่อ 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. หากมันมีมนุษย์ ให้กำหนดคุณสมบัติ Health ของพวกเขาเป็น 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 จาก Workspace

  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 เพื่อผ่านแต่ละองค์ประกอบในอาร์เรย์ คุณไม่จำเป็นต้องระบุจุดเริ่มต้นและสิ้นสุดของลูป ลูป for ที่ใช้ ipairs ถูกกำหนดดังนี้:

for index, value in ipairs(array) do

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

ในโค้ดถัดไป คุณไม่จำเป็นต้องใช้ดัชนีสำหรับอะไร ดังนั้นมันสามารถถูกปล่อยว่างไว้ด้วย _ สร้างลูป for โดยใช้ฟังก์ชัน 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 เชื่อมต่อเหตุการณ์ Touched กับฟังก์ชันนิรนามที่มีพารามิเตอร์ชื่อว่า 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 ไว้ในคำสั่ง if โดยมีเงื่อนไขว่า 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

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

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

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

โค้ดสุดท้าย


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
©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ