Hướng dẫn trung cấp

Tạo một vật phẩm phục hồi sức khỏe

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Trong các bài hướng dẫn Scripting Cơ bản, bạn đã lập trình các phần riêng lẻ để tạo ra các cảnh chơi được. Với phương pháp trước đó, nếu bạn sao chép các phần, bạn cũng sẽ có các tập lệnh sao chép. Điều này sẽ khiến việc cập nhật các tập lệnh trở nên tẻ nhạt vì các thay đổi sẽ phải được thực hiện từng tập lệnh một.

Trong bài hướng dẫn này, một mẫu khác sẽ được sử dụng để tạo ra một số vật phẩm phục hồi sức khỏe, với chỉ một bản sao của tập lệnh xác định hành vi của vật phẩm phục hồi sức khỏe. Khi vật phẩm được chạm vào, nó sẽ phục hồi sức khỏe của người chơi, mờ đi một chút và bị vô hiệu hóa trong một khoảng thời gian ngắn.

Thiết lập

Trước tiên, bạn sẽ cần một phần hoặc một mô hình để sử dụng làm vật phẩm phục hồi sức khỏe. Thế giới ví dụ Showdown Town bao gồm rất nhiều vật phẩm phục hồi sức khỏe phân bố khắp bản đồ.

Tùy chọn Chỉnh sửa trong Studio từ trang chính của trải nghiệm

Mỗi vật phẩm phục hồi sức khỏe là một sự kết hợp của hai phần hình chữ nhật với một PointLight màu xanh lá cây bên trong. Tất cả chúng đều được lưu trữ trong một thư mục trong Workspace gọi là HealthPickups, đây là nơi mà tập lệnh sẽ tìm kiếm chúng. Nếu bạn thêm bất kỳ vật phẩm nào khác vào bản đồ, điều cần thiết là đảm bảo rằng chúng cũng được lưu trong thư mục này.

Phục hồi sức khỏe

Trước tiên, tập lệnh cần phục hồi sức khỏe của người chơi. Mẫu này có thể bạn đã quen thuộc từ bài hướng dẫn Lava Chết Người.

  1. Trong ServerScriptService, thêm một tập lệnh gọi là PickupManager.

  2. Trong tập lệnh này, khai báo một hằng số gọi là MAX_HEALTH với giá trị 100.

  3. Tạo một hàm gọi là onTouchHealthPickup với các tham số cho phần khác đã chạm vào vật phẩm và vật phẩm phục hồi sức khỏe này.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. Trong hàm, lấy mô hình nhân vật từ cha của otherPart. Tiếp theo, kiểm tra xem nó có một Humanoid bằng cách sử dụng FindFirstChildWhichIsA().

  5. Nếu nó có một humanoid, hãy đặt thuộc tính Health của chúng thành 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

Lấy thư mục vật phẩm

Thư mục chứa các vật phẩm phục hồi sức khỏe có thể chưa được tải vào trải nghiệm khi tập lệnh chạy. WaitForChild có thể được sử dụng để tạm dừng tập lệnh và lấy thư mục HealthPickups khi nó được tải.

Khi được gọi trên một thư mục, hàm GetChildren sẽ trả về một mảng chứa các nội dung của thư mục đó.

  1. Dưới MAX_HEALTH, khai báo một biến gọi là healthPickupsFolder và sử dụng hàm WaitForChild để lấy thư mục HealthPickups từ Workspace.

  2. Tạo một biến có tên healthPickups để lưu trữ kết quả của việc gọi hàm GetChildren trên 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

Vòng lặp với ipairs

onTouchHealthPickup cần được gọi cho mỗi vật phẩm phục hồi sức khỏe trong mảng. Để làm điều này một cách hiệu quả, một kiểu cú pháp vòng lặp mới sẽ được sử dụng.

ipairs là một hàm có thể được sử dụng với vòng lặp for để đi qua từng phần tử của một mảng. Bạn không cần chỉ định vị trí mà vòng lặp bắt đầu và kết thúc. Một vòng lặp for sử dụng ipairs được định nghĩa như sau:

for index, value in ipairs(array) do

  • Chỉ số: đây tương đương với biến điều khiển trong một vòng lặp for thông thường.
  • Giá trị: giá trị này sẽ được lấp đầy với mỗi phần tử trong mảng khi vòng lặp thực hiện. Đây là một ý tưởng tốt để đặt tên cho biến giá trị theo những gì nó sẽ chứa.
  • Mảng: mảng bạn muốn lặp qua sẽ được truyền vào hàm ipairs.

Trong đoạn mã sau, bạn không cần chỉ số cho bất cứ điều gì, vì vậy nó có thể để trống với _. Tạo một vòng lặp for sử dụng hàm ipairs, truyền 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

Cần có một hàm bao để truyền vật phẩm phục hồi sức khỏe cho hàm onTouchHealthPickup khi kết nối với sự kiện Touched.

  1. Trong vòng lặp for, kết nối sự kiện Touched đến một hàm vô danh với một tham số gọi là otherPart.

  2. Gọi hàm onTouchHealthPickups, truyền cả tham số otherParthealthPickup.


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

Kiểm tra mã của bạn ngay bây giờ và bạn nên thấy rằng vật phẩm phục hồi sức khỏe phục hồi sức khỏe của bạn. Bạn sẽ cần làm tổn thương nhân vật của mình trước - hãy thử đứng trên ống thông gió bên cạnh điểm khởi đầu.

Ống thông gió đang bốc hơi trong thế giới ví dụ bên phải của điểm khởi đầu

Một thanh sức khỏe nên xuất hiện ở góc trên bên phải và sẽ biến mất khi người chơi được hồi phục.

Thời gian hồi phục vật phẩm

Hiện tại, vật phẩm sẽ vô thời hạn hồi phục bất kỳ người chơi nào chạm vào nó. Sẽ hiệu quả hơn nếu nó chỉ có thể được lấy một lần, với thời gian hồi phục ngắn trước khi nó có thể được sử dụng lại.

Trước tiên, bạn cần ghi lại liệu vật phẩm có trong khoảng thời gian hồi phục hay không. Mẫu dưới đây có thể bạn đã quen thuộc từ bài hướng dẫn Bẫy Mờ - lần này, việc chống phản hồi sẽ được thực hiện bằng cách thiết lập một thuộc tính trên vật phẩm phục hồi sức khỏe.

  1. Trong vòng lặp for, thiết lập một thuộc tính mới gọi là "Enabled" thành true.

  2. Bọc mã bên trong onTouchHealthPickup bằng một câu lệnh if với điều kiện 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

Vô hiệu hóa vật phẩm

Vật phẩm nên cung cấp phản hồi trực quan rằng nó đang bị vô hiệu hóa - một cách phổ biến để chỉ ra điều này là làm cho nó hơi trong suốt.

  1. Khai báo ba hằng số ở đầu tập lệnh (cảm thấy tự do điều chỉnh mỗi giá trị theo ý thích của bạn):

    • 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. Trong câu lệnh if trong onTouchHealthPickup, đặt Transparency của vật phẩm thành DISABLED_TRANSPARENCY, và giá trị của thuộc tính Enabled thành 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. Gọi hàm task.wait(), truyền COOLDOWN là khoảng thời gian cần chờ.

  4. Đặt lại Transparency thành ENABLED_TRANSPARENCYEnabled trở lại 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

Kiểm tra lại vật phẩm phục hồi sức khỏe của bạn: bạn nên thấy rằng khi bạn chạm vào vật phẩm nó phục hồi sức khỏe của bạn, trở nên trong suốt, rồi sau đó quay lại sẵn sàng để sử dụng lại.

Nếu bạn muốn làm cho phản hồi mạnh mẽ hơn cho người chơi khi vật phẩm được thu thập, hãy thử giảm độ sáng của PointLight trong vật phẩm phục hồi sức khỏe khi bạn thay đổi độ trong suốt.

Hãy thử sử dụng các vật phẩm phục hồi sức khỏe này trong các dự án của riêng bạn, hoặc thay đổi diện mạo và hiệu ứng để cung cấp một loại tăng cường khác cho người chơi của bạn.

Mã cuối cùng


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, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.