Trong suốt các hướng dẫn lập trình cơ bản, bạn đã lập trình các phần riêng lẻ để tạo cảnh có thể chơi.Với phương pháp trước, nếu bạn sao chép các bộ phận, bạn cũng sẽ có các kịch bản trùng lặp.Điều này sẽ làm cho việc cập nhật các kịch bản trở nên tẻ nhạt bởi vì các thay đổi phải được thực hiện theo kịch bản.
Trong hướng dẫn này, một mẫu khác sẽ được sử dụng để tạo một số lượng lấy sức khỏe, chỉ với một bản sao duy nhất của kịch bản xác định hành vi lấy sức khỏe.Khi lấy được chạm vào, nó sẽ khôi phục sức khỏe của người chơi, mờ dần và bị vô hiệu hóa trong một 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 như một pickup.Thế giới ví dụ Thị trấn Showdown bao gồm rất nhiều lượt nhặt sức khỏe được phân bố khắp bản đồ.

Mỗi lần nhặt sức khỏe là một Liên minh của hai phần hình chữ nhật có điểm sáng xanh bên trong.Tất cả được lưu trong một thư mục trong Workspace có tên là HealthPickups , nơi mà lệnh sẽ tìm kiếm chúng.Nếu bạn thêm bất kỳ thứ gì vào bản đồ, bạn phải chắc chắn rằng chúng cũng được lưu trong thư mục này.


Phục hồi sức khỏe
Để bắt đầu, kịch bản cần phải khôi phục sức khỏe của người chơi. Mẫu này nên quen thuộc với bạn từ hướng dẫn Nham thạch chết chóc.
Trong ServerScriptService , thêm một kịch bản có tên là PickupManager .
Trong kịch bản này, tuyên bố một biến có tên là MAX_HEALTH với giá trị 100 .
Tạo một chức năng có tên là onTouchHealthPickup với các tham số cho phần kia chạm vào việc nhặt và chính việc nhặt.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endTrong chức năng, lấy mô hình nhân vật từ cha của otherPart . Tiếp theo, kiểm tra xem nó có sử dụng Humanoid dùng FindFirstChildWhichIsA() không.
Nếu nó có một humanoid, hãy đặt thuộc tính Sức khỏe của họ thành MAX_HEALTH.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Nhận thư mục nhận lấy
Thư mục chứa các lựa chọn sức khỏe có thể không được tải vào trò chơi khi kịp thời chạy lệnh.WaitForChild có thể được sử dụng để tạm dừng kịch bản và lấy thư mục HealthPickups khi nó được tải.
Khi gọi vào một thư mục, chức năng GetChildren sẽ trả về một mảng nội dung của thư mục.
Dưới MAX_HEALTH, tuyên bố một biến có tên là healthPickupsFolder và sử dụng chức năng WaitForChild để lấy thư mục HealthPickups từ Workspace.
Tạo một biến có tên là healthPickups để lưu kết quả của việc gọi chức năng GetChildren trên healthPickupsFolder .
local MAX_HEALTH = 100local healthPickupsFolder = workspace:WaitForChild("HealthPickups")local healthPickups = healthPickupsFolder:GetChildren()local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Vòng lặp với ipairs
onTouchHealthPickup cần phải gọi cho mỗi lấy sức khỏe trong mảng. Để làm điều này hiệu quả, một loại mới của ngữ pháp vòng lặp sẽ được sử dụng.
ipairs là một chức năng có thể được sử dụng với một vòng lặp for để đi qua mỗi yếu tố của một mảng.Bạn không cần phải xác định nơi vòng lặp bắt đầu và kết thúc.Một vòng lặp sử dụng ipairs được định nghĩa như sau:
- Chỉ mục : điều này tương đương với biến điều khiển trong một vòng lặp thường.
- Giá trị : điều này sẽ được lấp đầy với mỗi yếu tố trong mảng khi vòng lặp lặp lại.Là một ý tưởng tốt để đặt tên cho biến giá trị sau khi nó thực sự chứa đựng.
- Array : array bạn muốn lặp lại được truyền cho chức năng ipairs.
Trong mã sau, bạn không cần chỉ mục cho bất cứ thứ gì, vì vậy nó có thể được để trống với _ .Tạo một cho vòng lặp sử dụng chức năng 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
Chức năng bọc sẽ cần thiết để chuyển giao việc lấy sức khỏe sang chức năng onTouchHealthPickup khi kết nối với sự kiện Touched .
Trong vòng lặp for, kết nối sự kiện đã chạm với một chức năng vô danh với một tham số có tên là otherPart.
Gọi chức năng onTouchHealthPickups , truyền cả các tham số otherPart và healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.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 tìm thấy rằng việc lấy lại sức khỏe khôi phục sức khỏe của bạn.Bạn sẽ cần phải làm hỏng người chơi của bạn trước - hãy thử đứng trên ống thông hơi bên cạnh điểm sinh sản.
Một thanh sức khỏe nên xuất hiện ở phía trên bên phải sẽ biến mất khi người chơi được chữa lành.
Thời gian chờ lấy
Hiện tại, việc nhặt sẽ vĩnh viễn chữa lành bất kỳ người chơi nào chạm vào nó.Nó sẽ hiệu quả hơn trong một trò chơi nếu nó chỉ có thể được nhặt một lần, với một thời gian chờ ngắn trước khi có thể sử dụng lại.
Trước tiên, bạn cần ghi lại xem có hay không có cuộc gọi trong thời gian chờ.Mẫu dưới đây nên quen thuộc từ Bẫy mờ dần - lần này, sự chậm trễ sẽ được đạt được bằng cách thiết lập một thuộc tính trên việc lấy sức khỏe.
Trong vòng lặp for, thiết lập một thuộc tính mới **** được gọi là "Enabled" đến true .
Bọc mã bên trong onTouchHealthPickup trong một tuyên bố if với điều kiện healthPickup:GetAttribute("Enabled") .
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendendendfor _, healthPickup in ipairs(healthPickups) dohealthPickup:SetAttribute("Enabled", true)healthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Tắt việc nhặt
Việc thu thập nên cung cấp phản hồi hình ảnh rằng nó đã bị vô hiệu hóa - một cách phổ biến để chỉ ra điều này là làm cho nó một chút minh bạch.
Tuyên bố ba biến cố định ở đầu của kịch bản (hãy cảm thấy tự do để điều chỉnh mỗi giá trị theo ý muốn của bạn):
- ENABLED_TRANSPARENCY = 0.4
- DISABLED_TRANSPARENCY = 0.9
- COOLDOWN = 10
local MAX_HEALTH = 100local ENABLED_TRANSPARENCY = 0.4local DISABLED_TRANSPARENCY = 0.9local COOLDOWN = 10local healthPickupsFolder = workspace:WaitForChild("HealthPickups")Trong if tuyên bố trong onTouchHealthPickup, đặt Transparency của việc nhặt lên 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") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendGọi chức năng task.wait() , chuyển COOLDOWN như số tiền để chờ.
Set Transparency lại ENABLED_TRANSPARENCY và Enabled lại true.
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)task.wait(COOLDOWN)healthPickup.Transparency = ENABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", true)endendend
Kiểm tra lựa chọn của bạn một lần nữa: bạn nên tìm thấy điều đó khi bạn chạm vào lựa chọn nó sẽ khôi phục sức khỏe của bạn, trở nên minh bạch, 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 trở nên có ý nghĩa hơn đối với người chơi khi lấy được, hãy thử cắt độ sáng của Điểm sáng trong lấy khi bạn thay đổi độ trong suốt.
Hãy thử sử dụng các lựa chọn 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 power-up khác cho người chơi của bạn.
Mã cuối mã
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