第 15 课：屏幕界面：制作自己的探险 HUD

请先阅读对应网页。这里按章节提供代码，可能包含先后替换的实验版本，不要全部同时运行。
.luau 文件内容请复制到指定 Script / LocalScript / ModuleScript；.txt 是层级或说明，不是可执行代码。
第 25 课默认 PRACTICE=true，不连接云端，也不跨 Stop 保存。第 28 课包含明确标注的故意错误实验。

01 · 先明确今天要做出的结果
File → Save to File，把项目保存成 Lesson15.rbxl；后面每完成一节就按 Ctrl+S。
View → Explorer、Properties、Output，保证三个窗口都看得见。
确认 Explorer 中有 StarterGui。今天不需要导入模型或图片。

02 · 只创建两个对象，并把脚本放对位置
在 Explorer 把鼠标移到 StarterGui，点右侧的 ＋，搜索 ScreenGui，插入后按 F2 改名为 AdventureGui。
选中 AdventureGui，在 Properties 把 ResetOnSpawn 取消勾选；这样角色重生时不会重新创建整套 HUD。
再次点 AdventureGui 右侧的 ＋，搜索 LocalScript，改名为 HudController。注意图标必须是 LocalScript，不是普通 Script。
双击 HudController，删除默认内容，准备粘贴下一节的完整代码。

文件：02-create.txt
位置与用途：Explorer 结构 · 不是 Luau 代码

03 · 粘贴完整代码，先让成品跑起来
把完整代码粘贴到 HudController，按 Ctrl+S。
按 F5（Play），不要只按 F8（Run）；本课需要创建一个玩家客户端来运行 LocalScript。
看到 HUD 后，展开 Players → 你的名字 → PlayerGui → AdventureGui，对照上一节的运行层级。
查看 Output：应该出现 [HUD] 1/3，且没有红色错误。按 Shift+F5 停止测试。

文件：03-code.luau
位置与用途：StarterGui > AdventureGui > HudController（LocalScript）

04 · 做四次改动，亲眼看懂程序
把最后一行改成 renderQuest(0, 3)：应显示 0 / 3，进度条为空。
改成 renderQuest(2, 3)：应显示 2 / 3，蓝条约占三分之二。
改成 renderQuest(3, 3)：绿条填满，状态改为“任务完成，可以前往出口”。
改成 renderQuest(9, 3)：界面仍只显示 3 / 3。确认后恢复为 renderQuest(1, 3)。

文件：04-experiments.luau
位置与用途：四个测试值 · 实际使用时只保留一行

05 · 用一个失败实验理解 Scale、Offset 和 AnchorPoint
把完整代码里的 RUN_OVERFLOW_TEST 从 false 改为 true。用手机竖屏模拟，700 像素宽的面板会超出右边界。
把 RUN_OVERFLOW_TEST 恢复为 false，面板会重新使用 36% 宽度和 280–420 像素约束。
把 renderQuest 改成 2, 3，确认 ProgressFill 宽度随比例变化，而不是写死像素。
把 Count 的 AnchorPoint 临时改为 Vector2.new(0, 0)，观察数字为什么跑到右边界外；测试后恢复 Vector2.new(1, 0)。

文件：05-responsive.luau
位置与用途：溢出实验 · 修改完整程序中的同名开关

06 · 像上线前一样测试电脑和手机
按 F5 开始测试，再打开 Device Simulator；先选择一种 Phone 竖屏预设。
验收竖屏：面板左边距和上边距约 18 像素，右边仍有空隙，标题与目标没有被裁掉。
切到横屏：面板不会无限拉宽，最终宽度不超过 420 像素。
切回 Desktop：进度条、1 / 3 和状态文字仍在同一行序中，没有重叠。
Output 没有红色错误后，Shift+F5 停止并 Ctrl+S 保存。

