Roblox Studio · 第 9 课

角色与生命值:制作熔岩和恢复站

认识 Player、Character 和 Humanoid,用每位角色独立的冷却制作扣血与回血机关。

10–15 岁 60 分钟 Humanoid / Health 动手实践 测试与保存

Course overview

踩到熔岩会掉血,走到恢复站会补回来。

这次的机关不只变色,还会改变角色的生命值。我们先把伤害设置得很小,让你有时间观察、离开和重试。

Player 是玩家记录,Character 是场景中的角色模型,Humanoid 管理生命值和移动。找到 Humanoid 还不能保证它属于真人玩家,因为 NPC 也可以拥有 Humanoid。

01 · BEFORE

开始之前

理解 Touched、函数、if 和 table。使用新建的 Lesson09 Baseplate。

02 · MAKE

你的作品

一块每秒最多扣 10 点生命的 Lava,以及一块每秒最多恢复 10 点的 HealPad。

03 · CHECK

完成标志

普通 Part 不触发;两名玩家各自有冷却;生命值不会超过 MaxHealth。

角色受伤时显示生命条的官方场景截图
图 9-1:官方生命条截图:角色受伤后,生命条能提供视觉反馈;判断数值时仍应检查 Humanoid.Health。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Learning route

先准备,再动手;看到结果后,记得保存。

每完成一小步,就测试一次。先说出你预计会看到什么,再用 Play 和 Output 检查,不用急着一次写完所有代码。

1

01 · 在安全地面上摆两块机关

先保留 Baseplate,不做一碰就失败的陷阱。你需要看清生命值怎样变化,而不是不断重生。

2

02 · 从碰到的零件找到玩家

Touched 给你的 otherPart 可能是一条腿,也可能是普通方块。FindFirstAncestorOfClass("Model") 先寻找外层模型,GetPlayerFromCharacter 再确认它是不是玩家的角色。

3

03 · 给每个角色一把自己的冷却锁

cooldown[character] 把“正在冷却”记在对应角色名下。一个玩家触碰,不会锁住另一个玩家。

4

04 · 冷却不是持续伤害计时器

task.delay(1, function() ... end) 安排一秒后清除记录,不会让后面的脚本停在原地。冷却表的记录会被清理,不需要永久保存旧角色。

5

05 · 分别检查伤害、治疗和重生

Roblox 的默认角色可能缓慢自动回血,短时间观察更容易分辨你自己的治疗效果。不要把几秒后的自动恢复误认为重复触发。

Step by step

01 · 在安全地面上摆两块机关

先保留 Baseplate,不做一碰就失败的陷阱。你需要看清生命值怎样变化,而不是不断重生。

两块机关分别处理伤害和治疗。它们使用同一份脚本,只通过 DAMAGE 这个数字区分效果。

  1. 创建 Lava 与 HealPad,Size 都为 8, 1, 8,Position 分别为 -8, 0.5, -12 和 8, 0.5, -12。
  2. 两者 Anchored、CanTouch、CanCollide 均为 true;用红、绿颜色区分。
  3. 在 Lava 内创建普通 Script,命名 HealthPad。

Step by step

02 · 从碰到的零件找到玩家

Touched 给你的 otherPart 可能是一条腿,也可能是普通方块。FindFirstAncestorOfClass("Model") 先寻找外层模型,GetPlayerFromCharacter 再确认它是不是玩家的角色。

这比只查 Humanoid 更严格。如果找不到模型、玩家或存活的 Humanoid,就提前 return,不改变任何生命值。

  1. 读一遍下节脚本中的三个检查。
  2. 记住 Health 是当前生命,MaxHealth 是生命上限。
  3. 看到 nil 时先检查对象有没有找到,不要立刻添加更多等待。
Humanoid 的显示属性面板截图
图 9-2:官方 Humanoid 属性面板:先选中角色里的 Humanoid。图中是显示设置,本课要查找的是 Health 与 MaxHealth。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Step by step

03 · 给每个角色一把自己的冷却锁

cooldown[character] 把“正在冷却”记在对应角色名下。一个玩家触碰,不会锁住另一个玩家。

扣血使用 TakeDamage,能够尊重 ForceField 保护。出生后的保护罩存在时不掉血是正常现象,等保护结束再测试;治疗则用 math.min 限制上限。

  1. 将下面代码放进 Lava > HealthPad。
  2. 复制 HealthPad 到 HealPad 内,只把 DAMAGE 改成 -10。
  3. Play 后等出生保护结束,踩红块再踩绿块;查看 Output 的生命值。
Workspace > Lava / HealPad > HealthPad · 各放一份Luau
local Players = game:GetService("Players")
local pad = script.Parent
local DAMAGE = 10 -- HealPad 内改为 -10,表示恢复
local cooldown = {}

pad.Touched:Connect(function(otherPart)
    local character = otherPart:FindFirstAncestorOfClass("Model")
    if not character then return end
    local player = Players:GetPlayerFromCharacter(character)
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    if not player or not humanoid or humanoid.Health <= 0 then return end
    if cooldown[character] then return end
    cooldown[character] = true

    if DAMAGE > 0 then
        humanoid:TakeDamage(DAMAGE)
    else
        humanoid.Health = math.min(humanoid.MaxHealth, humanoid.Health - DAMAGE)
    end
    print(player.Name, "Health:", humanoid.Health)
    task.delay(1, function()
        cooldown[character] = nil
    end)
end)

Step by step

04 · 冷却不是持续伤害计时器

task.delay(1, function() ... end) 安排一秒后清除记录,不会让后面的脚本停在原地。冷却表的记录会被清理,不需要永久保存旧角色。

Touched 是接触事件,不承诺站着不动时每秒触发。这里的规则是“新接触到来时,一秒内最多处理一次”,不是“只要站在上面就每秒扣血”。

  1. 反复走下、走上红块,观察输出间隔。
  2. 站着不动也试一次,记录与来回走的差别。
  3. 把普通 Part 放到机关上,确认没有玩家生命值消息。

Step by step

05 · 分别检查伤害、治疗和重生

Roblox 的默认角色可能缓慢自动回血,短时间观察更容易分辨你自己的治疗效果。不要把几秒后的自动恢复误认为重复触发。

如果绿块也扣血,检查的是绿块里面那份 DAMAGE,而不是红块脚本。调试时确认自己选中了哪个对象。

  1. 受伤后踩 HealPad,观察生命增加但不超过上限。
  2. 用两个玩家测试时,一个人的冷却不能阻止另一个人。
  3. 重生后重新测试,确认新角色仍能使用机关。

Homework

轮到你来改一改,做出自己的版本。

1 温和陷阱

把伤害改为 5,治疗改为 15,并分别测试。

2 画出对象关系

画出 Player、Character、Humanoid 的关系,标记 Health 所在位置。

3 选做:触碰反馈

加一条含机关名称的 print,区分 Lava 与 HealPad 的消息。

完成标准:先在 Playtest 中验证作品,再点击 Stop,保存为“姓名缩写_Lesson09”或对应 Homework 副本;不要覆盖上一课的可运行版本。

Exit questions

先自己回答,再展开看看。

有 Humanoid 的模型一定是玩家吗?

不是,NPC 也可能有。GetPlayerFromCharacter 用来确认是否属于玩家。

为什么用 cooldown[character]?

让不同角色各自冷却,避免全体玩家共用一把锁。

红块没扣血,为什么先等一会儿?

出生后的 ForceField 可能正在保护角色,TakeDamage 会尊重这层保护。

Touched 加冷却等于持续区域伤害吗?

不等于,它只处理接触事件,站立不动时不会保证每秒发生一次。

Explore further

需要查资料时,从这里出发。

正文代码可以直接复制。先确认脚本类型、放置位置,以及这段代码是完整版本还是小实验;不要把同一脚本的多个版本叠加运行。界面参考图已标注来源,图中的对象名可能与本课不同,请以操作步骤为准。