Roblox Studio · 第 10 课

金币与排行榜:让收集有记录

在服务器建立 leaderstats,制作只能领取一次、三秒后重新出现的金币。

10–15 岁 75 分钟 leaderstats / IntValue 动手实践 测试与保存

Course overview

捡起一枚金币,排行榜上准确地加一分。

收集让探险有了目标。不过,一次触碰可能来自好几个身体部件,直接加分会让金币突然变成十枚!这一课要把“准确记录”放在第一位。

金币记录放在玩家对象上,场景金币只负责检测领取。我们把两件事分成两个脚本,之后查错更轻松。

01 · BEFORE

开始之前

完成第 9 课,理解玩家筛选和冷却。新建 Lesson10 Baseplate。

02 · MAKE

你的作品

Coins 排行榜与一枚可领取、消失三秒后恢复的共享金币。

03 · CHECK

完成标志

每次有效领取只加 1;金币隐藏时不能重复领取;重生保留本次会话金币。

官方玩家列表与排行榜截图,列名与本课 Coins 不同
图 10-1:官方玩家列表参考:每位玩家有各自一行数据。本课只创建名为 Coins 的整数列。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Learning route

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

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

1

01 · 两个脚本,各做一件事

排行榜不是放在 Workspace 里的文字牌。Roblox 会识别每个 Player 下名为 leaderstats 的 Folder,并显示里面的数值。

2

02 · 玩家进入时,准备 Coins

leaderstats 必须全小写。Coins 是 IntValue 对象,数字保存在 Coins.Value 中;不能把整个 Coins 对象当作数字相加。

3

03 · 先锁住金币,再加分

这次的 available 属于金币本身:谁先捡到,金币就为所有人消失三秒。这与上一课“每位角色分别冷却”是两种不同的游戏规则。

4

04 · 重生和退出不是一回事

角色失败重生时,Character 会换成新模型,但同一个 Player 仍在。因此 leaderstats 里的金币会保留。

5

05 · 给加分做三道检查

最重要的验收不是金币好不好看,而是重复触碰和多人争抢时是否仍只加一次。

Step by step

01 · 两个脚本,各做一件事

排行榜不是放在 Workspace 里的文字牌。Roblox 会识别每个 Player 下名为 leaderstats 的 Folder,并显示里面的数值。

本课所有加分都由普通 Script 在服务器执行。不在 LocalScript 里决定玩家应该得到多少金币。

  1. 创建 Anchored 的 Coin,Size 设为 3, 3, 1,Position 设为 0, 3, -10。
  2. Coin 的 CanCollide=false、CanTouch=true,颜色设为金色。
  3. 创建 ServerScriptService > Leaderboard,以及 Coin > CollectCoin 两个普通 Script。

Step by step

02 · 玩家进入时,准备 Coins

leaderstats 必须全小写。Coins 是 IntValue 对象,数字保存在 Coins.Value 中;不能把整个 Coins 对象当作数字相加。

先连接 PlayerAdded,再处理当前已经存在的玩家,可以照顾脚本启动时已在场的测试角色。重复检查能避免同名文件夹被建两次。

  1. 把代码放进 Leaderboard。
  2. Play 后展开 Players > 你的玩家 > leaderstats,检查 Coins.Value=0。
  3. 若玩家列表折叠,打开它查看 Coins 列;也可以直接用 Explorer 验证。
ServerScriptService > Leaderboard · 完整脚本Luau
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
在 ServerScriptService 创建排行榜脚本的截图
图 10-2:官方操作截图:在 ServerScriptService 内插入普通 Script,让服务器负责创建 leaderstats。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Step by step

03 · 先锁住金币,再加分

这次的 available 属于金币本身:谁先捡到,金币就为所有人消失三秒。这与上一课“每位角色分别冷却”是两种不同的游戏规则。

先确认玩家和金币数据,再把 available 设为 false。锁定之前没有等待,因此紧接着到来的身体部件不能重复加分。

  1. 将代码放进 Coin > CollectCoin。
  2. 靠近金币:它隐藏,Coins 加 1。
  3. 三秒后金币重新出现,离开再走近可以再次领取。
Workspace > Coin > CollectCoin · 完整脚本Luau
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

04 · 重生和退出不是一回事

角色失败重生时,Character 会换成新模型,但同一个 Player 仍在。因此 leaderstats 里的金币会保留。

停止测试或离开服务器后,这些内存数据就结束了。下次 Play 又是 0,不是保存出错——我们还没制作存档。第 25 课才会讨论持久保存。

  1. 领取 2 枚金币,再通过测试菜单重置角色。
  2. 检查重生后 Coins 仍是 2。
  3. Stop 后重新 Play,确认 Coins 回到 0。

Step by step

05 · 给加分做三道检查

最重要的验收不是金币好不好看,而是重复触碰和多人争抢时是否仍只加一次。

复制金币时连同子脚本一起复制,每枚金币会拥有自己的 available。为了先掌握规则,这里只测试三枚,不一次生成几百枚。

  1. 快速走过金币,确认只增加 1。
  2. 复制两枚金币分别领取,确认互不锁住。
  3. 用两个玩家同时靠近同一枚,确认一轮总计只发放 1 枚。

Homework

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

1 三枚金币

把金币排成三角形,记录逐个领取后的 Coins。

2 慢一点重生

把金币恢复时间改为 5 秒,确认这段时间不能领取。

3 选做:奖励常量

新增 REWARD=2,用它替换加分中的 1,并更新你的测试预期。

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

Exit questions

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

leaderstats 的大小写可以随意改吗?

不可以,Roblox 依赖这个全小写名称识别排行榜。

为什么锁定要放在加分之前?

阻止紧接着到来的触碰重复领取。锁定前也不应等待。

这枚金币是每人都有一份吗?

不是,它是共享金币,谁先领取就暂时从所有人场景里消失。

Stop 后金币为 0 是 bug 吗?

不是,本课数据只保留在当前服务器会话,尚未接入存档。

Explore further

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

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