在基本指令教學中,您將指定的零件聯合成一個可玩的場景。 使用以前的方法,如果您複製零件,您將會有重複的指令碼。 這將使更新指令碼�edious,因為變更將需要在每個零件上執行。
在這個教學中,將使用不同的模式來創建一些健康吸取,這只是一個腳本的複製,決定了健康吸取行為。當吸取被觸摸時,會恢復玩家的健康,褪色稍微,並在一個短期的時間內停用。
設置
首先,您需要一個零件或模型來作為撿起點使用。 Showdown Town example world 包含許多健康撿起點在地圖上分布。
每個生命點擊都是由兩個長方形零件和綠色點光內部組成。它們都存放在工作區的 HealthPickups 夾中,這裡是您的腳本在找尋它們的地方。如果您添加任何更多到地圖,就必須確認它們也存放在此夾中。
恢復生命值
首先,需要恢復玩家的生命值。這種模式應該從致命岩漿教學中熟悉。
在 ServerScriptService 中,添加名為 PickupManager 的指令。
在此指令碼中,將 MAX_HEALTH 變更為值 100 的常量。
創建名為 onTouchHealthPickup 的函數,並且為其他部分設定接觸撿起和撿起自己的參數。
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)end在 function 中,從 otherPart 的父親獲取角色模型。然後,檢查它是否使用 Humanoid 使用 FindFirstChildWhichIsA() 來獲得 1>Class.Humanoid1> 。
如果它有人形,將其 生命值 屬性設為 MAX_HEALTH 。
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
取得撿起資料夾
夾含健康撿起的文件夾可能沒有載入到遊戲時間,WaitForChild 可以暫停遊戲並在遊戲載入時獲得健康撿起文件夾。
當在一個夾位上呼叫時,GetChildren 函數會返回一個夾位內容的列表。
在 MAX_HEALTH 下,宣稱變量名稱為 healthPickupsFolder 並使用 WaitForChild 函數從工作區獲取 健康撿起 文件夾。
創建名為 healthPickups 的變數來儲存在 GetChildren 上呼叫 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
使用 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 函數。
在 for 週期中,連接已觸發的事件到一個名為 otherPart 的隱藏函數。
呼叫 onTouchHealthPickups 函數,傳輸 both otherPart 參數和 healthPickup。
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
現在測試你的代碼,你應該找到健康撿起會恢復你的生命值。你需要先損壞你的玩家,試著站在生成點旁邊的通風口上。
玩家恢復時會消失的右上角會出現健康狀態條。
撿起冷卻時間
目前,撿起將永久治愈任何碰到它的玩家。它在遊戲中更有效,如果它只能在一次撿起,並且有一個短的冷卻時間之前可以再次使用。
首先,您需要記錄是否設置撿起在冷卻期間是否在等待中。以下的模式應該從淡出陷阱-這次,將通過設置撿起在健康撿起上設置屬性來達到 Debounce 。
在 for 週期中,設置名為 #Enabled" 的新 "Enabled" 來為 true 。
將代碼包含在 onTouchHealthPickup 內,以 if 句子中的條件 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
停用吸取
撿起應該提供視覺反饋,它被禁用 - 一個常見的方法是將它稍微透明化。
在指令碼的上方宣告三個變數 (請隨便調整每個值):
- 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")在 onTouchHealthPickup 中,將 Transparency 的選擇設置為 DISABLED_TRANSPARENCY,並將 1>Enable1> 屬性設置為 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)endendend呼叫 task.wait() 函數,將 COOLDOWN 作為等待量。
將 Transparency 設定為 ENABLED_TRANSPARENCY 和 Enabled 設定為 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
再次測試您的選擇:當您觸摸選擇時,您應該發現它會恢復您的生命值,變得透明,然後回來準備好再次使用。
如果您想讓玩家在領取時感到更有價值,請嘗試減少點光在領取時的亮度,當您變更透明度時,請在領取中切斷點光。
試著在你自己的項目中使用這些生命值提升,或是變更外觀和效果,以提供不同的強化道具給你的玩家。
最終代碼
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