Roblox Studio · 第 13 课

靠近再互动:给宝箱加提示按钮

用 ProximityPrompt 制作按键、触屏都能操作的宝箱,在服务器检查距离与冷却。

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

Course overview

靠近宝箱,看到提示,按住按钮后才打开。

触碰适合金币,但宝箱最好由玩家主动决定是否打开。ProximityPrompt 会在靠近时显示交互提示,并适配常见输入设备。

提示的文字、按住时长和距离都可以调整。与此同时,真正处理开启结果的服务器仍要检查玩家状态。

01 · BEFORE

开始之前

理解事件与每位玩家的记录。新建 Lesson13 Baseplate,不依赖金币脚本。

02 · MAKE

你的作品

一个每位玩家本次会话只能领取一次的训练宝箱,用 Output 显示领取结果。

03 · CHECK

完成标志

远处看不到提示,靠近可操作;同一玩家重复操作不会再领取,另一玩家仍可领取。

ProximityPrompt 在 Explorer 中的官方截图
图 13-1:官方 Explorer 截图:ProximityPrompt 放在场景对象里。本课把它放进 Chest。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Learning route

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

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

1

01 · 将提示装到宝箱里

本课用一个 Part 代表宝箱,不需要从 Toolbox 下载带脚本的陌生模型。提示放在这个 Part 内,交互位置就跟随宝箱。

2

02 · 提示出现,不等于已经领取

Triggered 是完成交互后的事件,会把触发的 Player 直接传给函数,不需要像 Touched 那样从身体零件反查玩家。

3

03 · 服务器确认资格,再记录领取

claimed[player] 记录每个人是否已经领过,玩家离开时清除。宝箱是每人一份,因此不会在第一个人领取后把整个 Prompt 禁用。

4

04 · 决定宝箱到底属于谁

共享宝箱和每人一份的宝箱,没有哪种永远更好。关键是先说清规则,再选择一个全局 boolean 或一张按玩家索引的表。

5

05 · 看不到提示时按顺序排查

最常见的问题是 Prompt 放错位置、距离太远或视线被遮挡。RequiresLineOfSight 开启时,遮挡会影响提示显示。

Step by step

01 · 将提示装到宝箱里

本课用一个 Part 代表宝箱,不需要从 Toolbox 下载带脚本的陌生模型。提示放在这个 Part 内,交互位置就跟随宝箱。

图中的官方提示可能使用不同模型或语言。你要找的是 Explorer 中的 ProximityPrompt 对象,以及右侧的属性,而不是照抄图中的场景名字。

  1. 创建 Chest:Size=6, 4, 4,Position=0, 2, -12,Anchored=true。
  2. 在 Chest 内插入 ProximityPrompt,保持名称 ProximityPrompt。
  3. 设置 ActionText=打开、ObjectText=训练宝箱、HoldDuration=0.5、MaxActivationDistance=10。
  4. 在 Chest 内创建普通 Script:ChestHandler。

Step by step

02 · 提示出现,不等于已经领取

Triggered 是完成交互后的事件,会把触发的 Player 直接传给函数,不需要像 Touched 那样从身体零件反查玩家。

HoldDuration=0.5 表示需要按住一小会儿。MaxActivationDistance 控制提示出现的范围,但界面规则不能代替服务器的奖励检查。

  1. Play 后从远处走近,观察提示何时出现。
  2. 试着只点一下,再按住半秒,比较结果。
  3. 按键名称跟随设备提示,不把教学只写成“按 E”。
靠近交互提示的组成示意图
图 13-2:官方交互提示示意图:区分动作文字、对象名称和输入提示,再设置你的“打开宝箱”。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Step by step

03 · 服务器确认资格,再记录领取

claimed[player] 记录每个人是否已经领过,玩家离开时清除。宝箱是每人一份,因此不会在第一个人领取后把整个 Prompt 禁用。

距离检查从 HumanoidRootPart 到宝箱中心计算。本课宝箱较小,允许 12 studs,给显示距离 10 留一点移动与网络余量。

  1. 粘贴完整脚本。
  2. 领取后查看 Output,第二次应提示 Already claimed。
  3. 这里先不加金币,避免与第 10 课的对象依赖混在一起;结果记录清楚后再扩展奖励。
Workspace > Chest > ChestHandler · 完整脚本Luau
local Players = game:GetService("Players")
local chest = script.Parent
local prompt = chest:WaitForChild("ProximityPrompt")
local claimed = {}

prompt.Triggered:Connect(function(player)
    local character = player.Character
    local root = character and character:FindFirstChild("HumanoidRootPart")
    local humanoid = character and character:FindFirstChildOfClass("Humanoid")
    if not root or not humanoid or humanoid.Health <= 0 then return end
    if (root.Position - chest.Position).Magnitude > 12 then return end
    if claimed[player] then
        print(player.Name, "Already claimed")
        return
    end
    claimed[player] = true
    print(player.Name, "Training chest claimed!")
end)

Players.PlayerRemoving:Connect(function(player)
    claimed[player] = nil
end)

Step by step

04 · 决定宝箱到底属于谁

共享宝箱和每人一份的宝箱,没有哪种永远更好。关键是先说清规则,再选择一个全局 boolean 或一张按玩家索引的表。

本课的领取记录在 Player 上下文中存在,角色重生不会重新领取,退出再进则会重置。它不是永久的每日奖励系统。

  1. 重置角色后再次打开,仍应被视为已领取。
  2. 启动两个测试玩家,分别领取一次。
  3. 不要把宝箱全局变成“空”的外观,却仍告诉后来玩家还有奖励;视觉需要匹配规则。

Step by step

05 · 看不到提示时按顺序排查

最常见的问题是 Prompt 放错位置、距离太远或视线被遮挡。RequiresLineOfSight 开启时,遮挡会影响提示显示。

先在没有墙的空地上测试,再加装饰。这样你不会把美术问题误判成脚本报错。

  1. 确认 Prompt 是 Chest 的子对象且 Enabled=true。
  2. 走到距离 10 studs 以内,面向宝箱。
  3. 测试按住操作、重复领取、两名玩家分别领取三种情况。

Homework

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

1 清楚的提示词

把提示改为“领取补给”和“探险补给箱”,让玩家不用猜。

2 比较两种手感

分别测试 HoldDuration=0 与 0.8,说明哪种更适合宝箱。

3 选做:共享版

在副本中改成全体共享一次,记录为什么不能再用同一套个人提示。

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

Exit questions

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

Triggered 传入的是身体零件吗?

不是,它直接传入触发交互的 Player。

为什么不在第一个人领取后禁用 Prompt?

本课规定每人一份,其他玩家还需要使用同一个 Prompt。

界面显示距离能代替服务器检查吗?

不能,服务器仍要验证角色、距离和领取记录。

重生会清空 claimed[player] 吗?

不会,玩家仍在会话中;离开时才清除这条记录。

Explore further

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

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