創建健康撿起

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

在基本指令教學中,您將指定的零件聯合成一個可玩的場景。 使用以前的方法,如果您複製零件,您將會有重複的指令碼。 這將使更新指令碼�edious,因為變更將需要在每個零件上執行。

在這個教學中,將使用不同的模式來創建一些健康吸取,這只是一個腳本的複製,決定了健康吸取行為。當吸取被觸摸時,會恢復玩家的健康,褪色稍微,並在一個短期的時間內停用。

設置

首先,您需要一個零件或模型來作為撿起點使用。 Showdown Town example world 包含許多健康撿起點在地圖上分布。

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. 在 function 中,從 otherPart 的父親獲取角色模型。然後,檢查它是否使用 Humanoid 使用 FindFirstChildWhichIsA() 來獲得 1>Class.Humanoid1> 。

  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 可以暫停遊戲並在遊戲載入時獲得健康撿起文件夾。

當在一個夾位上呼叫時,GetChildren 函數會返回一個夾位內容的列表。

  1. 在 MAX_HEALTH 下,宣稱變量名稱為 healthPickupsFolder 並使用 WaitForChild 函數從工作區獲取 健康撿起 文件夾。

  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 循環來通過陣列的每個元素的函數。您不需要指定循環開始和結束的位置。使用 ipairs 的 for 循環是如下所定義的:

  • 索引 : 這與正常 for 循環中的控制變數相等。
  • : 這會在循環中以每個元素在陣列中的順序來填充。建議您在值變量名稱之後標記值變量。
  • 陣列 : 你想要掃描的陣列傳入了 IP 陣列函數。

在下面的代碼中,您不需要指針索引為任何東西,因此可以用 _ 來空白。 創建一個 for 循環使用 ipairs 函數,傳送 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

連接到 onTouchHealthPickup 事件時,必須使用包裝函數將健康狀態傳递給 Touched 函數。

  1. 在 for 週期中,連接已觸發的事件到一個名為 otherPart 的隱藏函數。

  2. 呼叫 onTouchHealthPickups 函數,傳輸 both otherPart 參數和 healthPickup


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

現在測試你的代碼,你應該找到健康撿起會恢復你的生命值。你需要先損壞你的玩家,試著站在生成點旁邊的通風口上。

玩家恢復時會消失的右上角會出現健康狀態條。

撿起冷卻時間

目前,撿起將永久治愈任何碰到它的玩家。它在遊戲中更有效,如果它只能在一次撿起,並且有一個短的冷卻時間之前可以再次使用。

首先,您需要記錄是否設置撿起在冷卻期間是否在等待中。以下的模式應該從淡出陷阱-這次,將通過設置撿起在健康撿起上設置屬性來達到 Debounce 。

  1. 在 for 週期中,設置名為 #Enabled" 的新 "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. onTouchHealthPickup 中,將 Transparency 的選擇設置為 DISABLED_TRANSPARENCY,並將 1>Enable1> 屬性設置為 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_TRANSPARENCYEnabled 設定為 1> true1> 。


    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