在基础脚本教程中,您有脚本个人部分来创建可玩场景。 使用上述方法,如果您复制了部分,您将获得重复的脚本。 这将使更新脚本�edious,因为更改将需要通过脚本来执行。
在本教程中,将使用不同的模式来创建多个健康提取,仅使用一个脚本副本,确定健康提取行为。当触摸时,它将恢复玩家的生命值,稍微褪色并在短时间内禁用。
设置
首先,您需要一个部件或模型作为吊取使用。 示例城镇世界例子 包含大量的生命吊取分布在地图上。
每次从生命中获得的每个生命都是由两个长方形零件组成的联合,其中一个有绿色的点光。它们都存储在工作区的 HealthPickups 文件夹中,这是脚本在其中寻找它们的地方。如果您添加更多到地图上,则必须确保它们也存储在此文件夹中。
恢复生命值
首先,脚本需要恢复玩家的生命值。这个模式应该对您来说很熟悉,从致命岩浆教程开始。
在 服务器脚本服务 中,添加一个名为 PickupManager 的脚本。
在此脚本中,声明一个名为 MAX_HEALTH 的常量,其值为 100 。
创建一个名为 onTouchHealthPickup 的函数,该参数为其他部分触摸到吊取器和吊取器本身。
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)end在函数中,从 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可以用来暂停脚本并在它加载时获取HealthPickups文件夹。
当调用一个文件夹时,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
使用 IP 地址循环
onTouchHealthPickup 需要调用每个生命值提取在数组表中。为了有效地执行此操作,新的循环语法将被使用。
ipairs 是一个可以用于循环的函数,可以穿过数组列中的每个元素。您不需要指定循环的开始和结束。使用 ipairs 的循环是如下的:
- 索引索引 : 这相当于在普通 for 循环中的控制变量。
- 值值 :值将以循环中的每个元素为其填充。 命名值变量后,您可以了解其实际内容。
- 阵列 :您想要遍过的阵列传入到 ipairs 函数。
在下面的代验证码中,您不需要索引任何东西,因此它可以用 _ 的空白离开。 创建一个 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 the otherPart 参数和 healthPickup 。
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
测试您的代码现在,您应该发现健康采集可以恢复您的健康。您需要先对玩家造成伤害 - 尝试站在生成点旁边的通风口上。
生命值条应该出现在右上角,玩家被治愈时会消失。
冷却时间
目前,拾取将永久治愈任何触摸它的玩家。它在游戏中更有效,如果它只能在一次,并且在使用它之前进行一次短暂的冷却。
首先,您需要记录是否在冷却时间期间有召唤是否在冷却时间期间。下面的模式应该与 渐变陷阱 - 这次,渐变将通过将健康召唤设置为属性在冷却时间期间实现。
在 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> Enabled1> 属性值为 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