开始之前
完成第 9 课,理解玩家筛选和冷却。新建 Lesson10 Baseplate。
Course overview
收集让探险有了目标。不过,一次触碰可能来自好几个身体部件,直接加分会让金币突然变成十枚!这一课要把“准确记录”放在第一位。
金币记录放在玩家对象上,场景金币只负责检测领取。我们把两件事分成两个脚本,之后查错更轻松。
完成第 9 课,理解玩家筛选和冷却。新建 Lesson10 Baseplate。
Coins 排行榜与一枚可领取、消失三秒后恢复的共享金币。
每次有效领取只加 1;金币隐藏时不能重复领取;重生保留本次会话金币。

Learning route
每完成一小步,就测试一次。先说出你预计会看到什么,再用 Play 和 Output 检查,不用急着一次写完所有代码。
排行榜不是放在 Workspace 里的文字牌。Roblox 会识别每个 Player 下名为 leaderstats 的 Folder,并显示里面的数值。
leaderstats 必须全小写。Coins 是 IntValue 对象,数字保存在 Coins.Value 中;不能把整个 Coins 对象当作数字相加。
这次的 available 属于金币本身:谁先捡到,金币就为所有人消失三秒。这与上一课“每位角色分别冷却”是两种不同的游戏规则。
角色失败重生时,Character 会换成新模型,但同一个 Player 仍在。因此 leaderstats 里的金币会保留。
最重要的验收不是金币好不好看,而是重复触碰和多人争抢时是否仍只加一次。
Step by step
排行榜不是放在 Workspace 里的文字牌。Roblox 会识别每个 Player 下名为 leaderstats 的 Folder,并显示里面的数值。
本课所有加分都由普通 Script 在服务器执行。不在 LocalScript 里决定玩家应该得到多少金币。
Step by step
leaderstats 必须全小写。Coins 是 IntValue 对象,数字保存在 Coins.Value 中;不能把整个 Coins 对象当作数字相加。
先连接 PlayerAdded,再处理当前已经存在的玩家,可以照顾脚本启动时已在场的测试角色。重复检查能避免同名文件夹被建两次。
local Players = game:GetService("Players")
local function setupPlayer(player)
if player:FindFirstChild("leaderstats") then return end
local stats = Instance.new("Folder")
stats.Name = "leaderstats"
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Value = 0
coins.Parent = stats
stats.Parent = player
end
Players.PlayerAdded:Connect(setupPlayer)
for _, player in ipairs(Players:GetPlayers()) do
setupPlayer(player)
end

Step by step
这次的 available 属于金币本身:谁先捡到,金币就为所有人消失三秒。这与上一课“每位角色分别冷却”是两种不同的游戏规则。
先确认玩家和金币数据,再把 available 设为 false。锁定之前没有等待,因此紧接着到来的身体部件不能重复加分。
local Players = game:GetService("Players")
local coin = script.Parent
local available = true
coin.Touched:Connect(function(hit)
if not available then return end
local character = hit:FindFirstAncestorOfClass("Model")
local player = character and Players:GetPlayerFromCharacter(character)
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
if not player or not humanoid or humanoid.Health <= 0 then return end
local stats = player:FindFirstChild("leaderstats")
local coins = stats and stats:FindFirstChild("Coins")
if not coins then return end
available = false
coin.Transparency = 1
coin.CanTouch = false
coins.Value += 1
print(player.Name, "Coins:", coins.Value)
task.delay(3, function()
if not coin.Parent then return end
coin.Transparency = 0
coin.CanTouch = true
available = true
end)
end)
Step by step
角色失败重生时,Character 会换成新模型,但同一个 Player 仍在。因此 leaderstats 里的金币会保留。
停止测试或离开服务器后,这些内存数据就结束了。下次 Play 又是 0,不是保存出错——我们还没制作存档。第 25 课才会讨论持久保存。
Step by step
最重要的验收不是金币好不好看,而是重复触碰和多人争抢时是否仍只加一次。
复制金币时连同子脚本一起复制,每枚金币会拥有自己的 available。为了先掌握规则,这里只测试三枚,不一次生成几百枚。
Homework
把金币排成三角形,记录逐个领取后的 Coins。
把金币恢复时间改为 5 秒,确认这段时间不能领取。
新增 REWARD=2,用它替换加分中的 1,并更新你的测试预期。
Exit questions
不可以,Roblox 依赖这个全小写名称识别排行榜。
阻止紧接着到来的触碰重复领取。锁定前也不应等待。
不是,它是共享金币,谁先领取就暂时从所有人场景里消失。
不是,本课数据只保留在当前服务器会话,尚未接入存档。
Explore further
正文代码可以直接复制。先确认脚本类型、放置位置,以及这段代码是完整版本还是小实验;不要把同一脚本的多个版本叠加运行。界面参考图已标注来源,图中的对象名可能与本课不同,请以操作步骤为准。