Trong suốt các hướng dẫn Script Cơ bản, bạn đã có các bộ phận được lập trình riêng lẻ để tạo ra các 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 này, bạn sẽ có những bộ phận tương tự. Điều này sẽ làm cho việc cập nhật các bộ phận ted
Trong hướng dẫn này, một mẫu mã khác sẽ được sử dụng để tạo một loạt các pickup sức khỏe, với chỉ một bản sao duy nhất của script qui định hành vi pickup sức khỏe. Khi touch pickup, nó sẽ khôi phục sức khỏe người chơi, mời mời nhẹ và bị tắt cho một thời g
Cài đặt
Đầu 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 Showdown Town example world bao gồm nhiều pickup sức khỏe phân bố khắp bản đồ.
Mỗi lần nhặt sức khỏe là một Union của hai khu vực hình chữ nhật với một điểm ánh sáng xanh bên trong. Tất cả đều được lưu trong một thư mục trong Workspace tên là HealthPickups , nơi mà script sẽ tìm kiếm chúng. Nếu bạn thêm bất kỳ thứ gì vào bả
Phục hồi Sức khỏe
Để bắt đầu, script cần phải khôi phục sức khỏe của một người chơi. Mẫu này nên quen thuộc với bạn từ hướng dẫn Lava Độc hại.
Trong ServerScriptService , thêm một script tên là PickupManager .
Trong các dòng này, tuyên bố một biến đổi tên là MAX_HEALTH với giá trị 100 .
Tạo một chức năng tên là onTouchHealthPickup với các tham số cho phần còn lại mà chạm vào pickup và pickup itself.
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 có phải nó có một Humanoid bằng cách sử dụng FindFirstChildWhichIsA() .
Nếu nó có một hình người, thiết lập đặt tính Sức khỏe của họ lên MAX_HEALTH .
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Lấy thư mục Pickups
Thư mục chứa các mục chọn sức khỏe có thể không đã tải vào trò chơi vào thời điểm mà script chạy. WaitForChild có thể được sử dụng để tạm dừng script và lấy thư mục HealthPickups khi nó tải.
Khi gọi một thư mục, chức năng GetChildren sẽ trả lại một loạt các bản mục trong thư mục.
Dưới MAX_HEALTH, tuyên bố một biến tùy chỉnh 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 tên là healthPickups để lưu kết quả của cuộc gọi hàm 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
Loop với ipairs
onTouchHealthPickup cần phải được gọi mỗi lần lấy sức khỏe trong danh sách. Để làm điều này một cách hiệu quả, một loại mới của ngôn ngữ lập trình sẽ được sử dụng.
ipairs là một hàm có thể được sử dụng với một for lặp để qua mỗi thành phần của một bảng. Bạn không cần phải đặc biệt cho một for lặp sử dụng ipairs là được định nghĩa như sau:
- Ấn chỉnh索引 : đây là đương đồng với biến điều khiển trong một lượt lặp thông thường.
- Giá trị : điều này sẽ được lấp đầy với mỗi thành phần trong mảng khi lượt lặp lặp lại. Đây là một lý tưởng tốt để đặt biến giá trị sau những gì nó sẽ thực sự chứa.
- Array: : array bạn muốn lặp lại được truyền cho hàm ipairs.
Trong mã sau đây, bạn không cần chỉ mục cho bất kỳ thứ gì, vì vậy nó có thể được để trống với _ . Tạo một for lượt vòng bằng cách sử dụng chức năng ipairs, với 1> healthPickups1> .
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
Một hàm chức năng bao quanh sẽ được cần thiết để truyền sự lựa chọn sức khỏe lên hàm chức năng onTouchHealthPickup khi kết nối với sự kiện Touched .
Trong for loop, kết nối sự kiện Đã chạm đến một chức năng an toàn với một biến được gọi là otherPart .
Gọi hàm onTouchHealthPickups, truyền cả hai biến otherPart và healthPickup .
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Thử nghiệm mã của bạn ngay bây giờ và bạn nên thấy rằng dịch vụ nhặt chất béo lấy lại sức khỏe của bạn. Bạn sẽ cần phải làm hại người chơi của bạn trước đó - hãy thử đứng trên cái mở ở 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 cùng bên phải khi người chơi được chữa lành.
Động tốt lên
Hiện tại, hành động này sẽ mãi mãi chữa lành bất kỳ người chơi nào chạm vào nó. Nó sẽ được hiệu quả hơn trong một trò chơi nếu nó chỉ có thể được chọn một lần, với một cooldown ngắn trước khi nó có thể được sử dụng một lần nữa.
Đầu tiên, bạn cần ghi lại có hay không phải lựa chọn đang ở thời gian冷却. Mẫu dưới đây nên quen từ Bẫy mờ dần - lần này, độ giảm giá sẽ được thực hiện bằng cách thiết lập một đặc tính trên pickup sức khỏe.
Trong for loop, set a new attribute called "Enabled" to true .
Wrap the code inside onTouchHealthPickup in an if statement with the condition 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
Vô hiệu hóa việc nhặt lên
Cú đón sẽ cung cấp phản hồi thị giác rằng nó đã bị vô hiệu hóa - một cách phổ biến để cho thấy điều này là làm cho nó mời mịn.
Tuyên bố ba biến ở trên cùng của script (cảm thấy thoải mái để điều chỉnh mỗi giá trị theo cách 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 câu if trong onTouchHealthPickup, đặt Transparency của pickup lên DISABLED_TRANSPARENCY và giá trị của thuộc tính 1> Enabled1> lên 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 hào task.wait() , truyền COOLDOWN như số lượng để chờ đợi.
Set Transparency back to ENABLED_TRANSPARENCY and Enabled back to 1> true1> .
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
Thử lại hồi chọn của bạn: bạn nên tìm thấy rằng khi bạn chạm vào hồi chọn nó sẽ khôi phục sức khỏe của bạn, trong suốt, sau đó quay lại sẵn sàng để được sử dụng một lần nữa.
Nếu bạn muốn làm cho phản hồi ảnh hưởng mạnh hơn cho người chơi khi thu thập dữ liệu, hãy cắt giảm độ sáng của Điểm sáng trong pickup khi bạn thay đổi transparency.
Cố gắng sử dụng những 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 vẻ ngoài 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 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