创建一个健康吸取

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

在基础脚本教程中,您有脚本个人部分来创建可玩场景。 使用上述方法,如果您复制了部分,您将获得重复的脚本。 这将使更新脚本�edious,因为更改将需要通过脚本来执行。

在本教程中,将使用不同的模式来创建多个健康提取,仅使用一个脚本副本,确定健康提取行为。当触摸时,它将恢复玩家的生命值,稍微褪色并在短时间内禁用。

设置

首先,您需要一个部件或模型作为吊取使用。 示例城镇世界例子 包含大量的生命吊取分布在地图上。

Edit in Studio option from the experience's main page

每次从生命中获得的每个生命都是由两个长方形零件组成的联合,其中一个有绿色的点光。它们都存储在工作区的 HealthPickups 文件夹中,这是脚本在其中寻找它们的地方。如果您添加更多到地图上,则必须确保它们也存储在此文件夹中。

恢复生命值

首先,脚本需要恢复玩家的生命值。这个模式应该对您来说很熟悉,从致命岩浆教程开始。

  1. 服务器脚本服务 中,添加一个名为 PickupManager 的脚本。

  2. 在此脚本中,声明一个名为 MAX_HEALTH 的常量,其值为 100

  3. 创建一个名为 onTouchHealthPickup 的函数,该参数为其他部分触摸到吊取器和吊取器本身。


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. 在函数中,从 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可以用来暂停脚本并在它加载时获取HealthPickups文件夹。

当调用一个文件夹时,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

使用 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 函数。

  1. 在 for 循环中,将触摸事件连接到一个参数为 otherPart 的匿名函数。

  2. 调用 onTouchHealthPickups 函数,通过传递 both the otherPart 参数和 healthPickup


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

测试您的代码现在,您应该发现健康采集可以恢复您的健康。您需要先对玩家造成伤害 - 尝试站在生成点旁边的通风口上。

生命值条应该出现在右上角,玩家被治愈时会消失。

冷却时间

目前,拾取将永久治愈任何触摸它的玩家。它在游戏中更有效,如果它只能在一次,并且在使用它之前进行一次短暂的冷却。

首先,您需要记录是否在冷却时间期间有召唤是否在冷却时间期间。下面的模式应该与 渐变陷阱 - 这次,渐变将通过将健康召唤设置为属性在冷却时间期间实现。

  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> Enabled1> 属性值为 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