开始之前
理解 Touched、函数、if 和 table。使用新建的 Lesson09 Baseplate。
Roblox Studio · 第 9 课
认识 Player、Character 和 Humanoid,用每位角色独立的冷却制作扣血与回血机关。
Course overview
这次的机关不只变色,还会改变角色的生命值。我们先把伤害设置得很小,让你有时间观察、离开和重试。
Player 是玩家记录,Character 是场景中的角色模型,Humanoid 管理生命值和移动。找到 Humanoid 还不能保证它属于真人玩家,因为 NPC 也可以拥有 Humanoid。
理解 Touched、函数、if 和 table。使用新建的 Lesson09 Baseplate。
一块每秒最多扣 10 点生命的 Lava,以及一块每秒最多恢复 10 点的 HealPad。
普通 Part 不触发;两名玩家各自有冷却;生命值不会超过 MaxHealth。

Learning route
每完成一小步,就测试一次。先说出你预计会看到什么,再用 Play 和 Output 检查,不用急着一次写完所有代码。
先保留 Baseplate,不做一碰就失败的陷阱。你需要看清生命值怎样变化,而不是不断重生。
Touched 给你的 otherPart 可能是一条腿,也可能是普通方块。FindFirstAncestorOfClass("Model") 先寻找外层模型,GetPlayerFromCharacter 再确认它是不是玩家的角色。
cooldown[character] 把“正在冷却”记在对应角色名下。一个玩家触碰,不会锁住另一个玩家。
task.delay(1, function() ... end) 安排一秒后清除记录,不会让后面的脚本停在原地。冷却表的记录会被清理,不需要永久保存旧角色。
Roblox 的默认角色可能缓慢自动回血,短时间观察更容易分辨你自己的治疗效果。不要把几秒后的自动恢复误认为重复触发。
Step by step
先保留 Baseplate,不做一碰就失败的陷阱。你需要看清生命值怎样变化,而不是不断重生。
两块机关分别处理伤害和治疗。它们使用同一份脚本,只通过 DAMAGE 这个数字区分效果。
Step by step
Touched 给你的 otherPart 可能是一条腿,也可能是普通方块。FindFirstAncestorOfClass("Model") 先寻找外层模型,GetPlayerFromCharacter 再确认它是不是玩家的角色。
这比只查 Humanoid 更严格。如果找不到模型、玩家或存活的 Humanoid,就提前 return,不改变任何生命值。

Step by step
cooldown[character] 把“正在冷却”记在对应角色名下。一个玩家触碰,不会锁住另一个玩家。
扣血使用 TakeDamage,能够尊重 ForceField 保护。出生后的保护罩存在时不掉血是正常现象,等保护结束再测试;治疗则用 math.min 限制上限。
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
task.delay(1, function() ... end) 安排一秒后清除记录,不会让后面的脚本停在原地。冷却表的记录会被清理,不需要永久保存旧角色。
Touched 是接触事件,不承诺站着不动时每秒触发。这里的规则是“新接触到来时,一秒内最多处理一次”,不是“只要站在上面就每秒扣血”。
Step by step
Roblox 的默认角色可能缓慢自动回血,短时间观察更容易分辨你自己的治疗效果。不要把几秒后的自动恢复误认为重复触发。
如果绿块也扣血,检查的是绿块里面那份 DAMAGE,而不是红块脚本。调试时确认自己选中了哪个对象。
Homework
把伤害改为 5,治疗改为 15,并分别测试。
画出 Player、Character、Humanoid 的关系,标记 Health 所在位置。
加一条含机关名称的 print,区分 Lava 与 HealPad 的消息。
Exit questions
不是,NPC 也可能有。GetPlayerFromCharacter 用来确认是否属于玩家。
让不同角色各自冷却,避免全体玩家共用一把锁。
出生后的 ForceField 可能正在保护角色,TakeDamage 会尊重这层保护。
不等于,它只处理接触事件,站立不动时不会保证每秒发生一次。
Explore further
正文代码可以直接复制。先确认脚本类型、放置位置,以及这段代码是完整版本还是小实验;不要把同一脚本的多个版本叠加运行。界面参考图已标注来源,图中的对象名可能与本课不同,请以操作步骤为准。