Roblox Studio · 第 16 课

按钮与本地脚本:打开探险提示卡

用 LocalScript 和 Activated 制作可开关的提示面板,理解客户端界面的运行位置。

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

Course overview

按一下“提示”,展开线索;再按一下,收起来。

上一课的界面会显示文字,这次让它回应你的操作。提示面板只影响自己,不需要让所有玩家跟着一起打开。

LocalScript 正适合处理这类个人界面。你会使用 Activated,让按钮能接收常见鼠标、触屏与手柄激活操作。

01 · BEFORE

开始之前

完成第 15 课。可以另存其项目为 Lesson16;也可按下方结构重新建立。

02 · MAKE

你的作品

一个可展开和关闭的提示卡,按钮文字也随状态改变。

03 · CHECK

完成标志

连续点击五次,每次只切换一次;Output 没有找不到对象的错误。

官方按钮界面截图,本课使用文字按钮而非图片按钮
图 16-1:官方按钮外观参考:图中是图片按钮,本课使用 TextButton,先把点击反馈做清楚。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Learning route

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

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

1

01 · 把按钮和提示放在同一个界面里

为了不依赖上一课面板的内部结构,本课把两个新对象直接放到 AdventureGui 下。原有 Panel 可以保留在左上角。

2

02 · script.Parent 指向运行中的界面

这段脚本从 StarterGui 复制到 PlayerGui 后执行。因此 script.Parent 指向这位玩家自己的 AdventureGui。

3

03 · 让状态同时改变两处显示

isOpen 是这张提示卡的状态。一次点击把它取反,再根据状态更新面板 Visible 和按钮 Text。

4

04 · 本地界面不能决定金币奖励

“我打开提示”只需要改变自己的屏幕,用本地脚本很合适。“我获得金币”会影响游戏规则,需要服务器确认。

5

05 · 让提示卡对小屏幕也友好

300 像素宽的提示框在非常窄的屏幕上仍需检查。文字太长时,先缩短线索,而不是把字号压到看不清。

Step by step

01 · 把按钮和提示放在同一个界面里

为了不依赖上一课面板的内部结构,本课把两个新对象直接放到 AdventureGui 下。原有 Panel 可以保留在左上角。

在编辑状态就能看到提示框,但真正测试点击要用 Play。LocalScript 放在正确容器里运行,放在普通 Workspace Part 下通常不会按本课预期运行。

  1. 在 AdventureGui 中创建 TextButton:HintButton,Position={1,-136},{0,16},Size={0,120},{0,48},Text=提示。
  2. 同级创建 TextLabel:HintPanel,Position={0.5,-150},{0.5,-60},Size={0,300},{0,120}。
  3. HintPanel.Text=先去营地,再沿蓝色路标找桥。TextWrapped=true、TextSize=20、Visible=false。
  4. 在 AdventureGui 中创建 LocalScript:HintController。

Step by step

02 · script.Parent 指向运行中的界面

这段脚本从 StarterGui 复制到 PlayerGui 后执行。因此 script.Parent 指向这位玩家自己的 AdventureGui。

WaitForChild 等待按钮和提示对象准备好。它不能修复拼写错误,HintButton 与 hintButton 仍是两个名字。

  1. 检查 HintController 的图标和类型确实是 LocalScript。
  2. 对照层级确认 HintButton 与 HintPanel 是它的同级对象。
StarterGui 模板复制到 PlayerGui 的官方结构图
图 16-2:官方结构图:StarterGui 提供模板,玩家运行时看到的实例位于自己的 PlayerGui 中。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Step by step

03 · 让状态同时改变两处显示

isOpen 是这张提示卡的状态。一次点击把它取反,再根据状态更新面板 Visible 和按钮 Text。

把更新集中在 render 函数里,能减少“面板已关闭,按钮却还写着关闭”的不一致。事件只连接一次,不要在 render 里反复 Connect。

  1. 粘贴完整代码。
  2. Play 后点击按钮,观察面板与按钮文字一起改变。
  3. 连按五次,确认没有越点越快或一次跳两次的现象。
StarterGui > AdventureGui > HintController(LocalScript)Luau
local gui = script.Parent
local button = gui:WaitForChild("HintButton")
local panel = gui:WaitForChild("HintPanel")
local isOpen = false

local function render()
    panel.Visible = isOpen
    if isOpen then
        button.Text = "关闭提示"
    else
        button.Text = "提示"
    end
end

button.Activated:Connect(function()
    isOpen = not isOpen
    render()
end)
render()

Step by step

04 · 本地界面不能决定金币奖励

“我打开提示”只需要改变自己的屏幕,用本地脚本很合适。“我获得金币”会影响游戏规则,需要服务器确认。

先记住这个边界,下一课会用两个客户端亲眼观察差别。不要因为 LocalScript 写起来方便,就把重要游戏记录都放进去。

  1. 在 Output 中筛选 Client,确认本地消息与服务器消息能分开看。
  2. 若加入 print("Hint opened"),只让它表达界面操作,不把它当作奖励成功。

Step by step

05 · 让提示卡对小屏幕也友好

300 像素宽的提示框在非常窄的屏幕上仍需检查。文字太长时,先缩短线索,而不是把字号压到看不清。

如果点击没有反应,先检查是不是在 Play、按钮是否被别的界面遮住、LocalScript 是否报错。

  1. 用鼠标和设备模拟中的点击各测试一次。
  2. 确认关闭后看得见场景,不留下透明却挡操作的大面板。
  3. Stop 后保存,保留正确的对象名称。

Homework

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

1 换一条线索

写一条能帮助玩家行动、又不会直接泄露全部答案的提示。

2 默认状态

让游戏开始时面板关闭,并确认按钮文字匹配。

3 选做:计次

用本地变量记录打开次数,只在 Output 显示,不影响服务器奖励。

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

Exit questions

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

为什么用 LocalScript?

提示卡属于当前玩家的个人界面,不需要改变全体玩家的状态。

Activated 比只写鼠标点击更适合什么?

更适合兼容常见触屏和手柄的按钮操作。

为什么 Connect 不放进 render?

render 可能执行很多次,重复连接会让一次点击执行多个回调。

界面里自己加 Coins 值可靠吗?

不能作为权威奖励,重要记录应该由服务器验证并修改。

Explore further

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

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