Roblox Studio · 第 7 课

表与列表:给寻宝路线排顺序

用 table 保存路标、奖励和颜色,读懂索引、字典与遍历,点亮自己的寻宝路线。

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

Course overview

把三个路标放进一张表,按顺序点亮它们。

只有一个路标时,一个变量就够了。路标变成三个、十个,你不想给每个路标复制一套相同代码。table 可以帮你把相关数据放在一起。

这一课会用到两种整理方式:按顺序排队的数组,以及按名称查找的字典。它们在 Luau 中都是 table。

01 · BEFORE

开始之前

完成第 6 课,理解 for 循环和等待。使用独立的 Lesson07 Baseplate。

02 · MAKE

你的作品

一条按 Camp → Bridge → Cave 顺序亮起的路标路线。

03 · CHECK

完成标志

能通过调整表中顺序改变点亮次序,能解释 route[1] 与 settings.reward 的不同。

官方数组练习的角色与对话场景截图
图 7-1:官方数组应用参考:多句对话可以按顺序存进数组。本课把同样的思路用在 Camp、Bridge、Cave 三个路标上。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Learning route

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

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

1

01 · 给三个路标起准确的名字

先用第 2 课的操作摆出路线,代码负责决定点亮顺序。名字将成为程序寻找对象的线索,大小写必须一致。

2

02 · 数组像一列排好队的盒子

Luau 数组通常从 1 开始:route[1] 是第一项,route[3] 是第三项。#route 可读取这张没有空洞的列表的长度。

3

03 · 字典让设置自己说明用途

settings.reward 比 settings[2] 更容易读懂,因为 reward 已经说明这个数字是奖励。字典适合颜色、时长、奖励等有名字的数据。

4

04 · 同一段动作,依次交给三个路标

下面的完整脚本把“要处理谁”和“要做什么”分开。route 负责对象顺序,循环体负责改变颜色。

5

05 · 改数据,不乱改结构

增加第四站需要同时增加场景对象和列表项。只加字符串,没有对应的 Part,程序找不到它;只加 Part,没有加入列表,它就不会点亮。

Step by step

01 · 给三个路标起准确的名字

先用第 2 课的操作摆出路线,代码负责决定点亮顺序。名字将成为程序寻找对象的线索,大小写必须一致。

每个路标保持独立。不要把它们先放进 Model,否则本课的 workspace:WaitForChild(name) 就找不到直接子对象。

  1. 创建三个 Anchored 的 Part,分别命名 Camp、Bridge、Cave。
  2. Size 都设为 6, 1, 6,Position 分别为 0, 1, -8;0, 1, -18;0, 1, -28。
  3. 在 ServerScriptService 创建 RouteLights。

Step by step

02 · 数组像一列排好队的盒子

Luau 数组通常从 1 开始:route[1] 是第一项,route[3] 是第三项。#route 可读取这张没有空洞的列表的长度。

ipairs 会按 1、2、3……依次给出索引和值,遇到第一个缺失的值就停止。不要用 route[2] = nil 随意在数组中挖洞。

  1. 先运行短实验,观察 index 与 name。
  2. 把第一项与第三项交换,重新预测输出顺序。
ServerScriptService > RouteLights · 数组实验Luau
local route = {"Camp", "Bridge", "Cave"}
print("First stop:", route[1])
print("Stop count:", #route)
for index, name in ipairs(route) do
    print(index, name)
end
Output 窗口及过滤控件参考
图 7-2:官方 Output 界面参考:检查 ipairs 打印的索引与名称,确认路线顺序是 1、2、3。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Step by step

03 · 字典让设置自己说明用途

settings.reward 比 settings[2] 更容易读懂,因为 reward 已经说明这个数字是奖励。字典适合颜色、时长、奖励等有名字的数据。

字典没有“第一站、第二站”的路线顺序。不要依赖 pairs 遍历字典的先后顺序来安排关卡。

  1. 在刚才实验末尾添加下面的设置,读取 reward。
  2. 将 reward 改成 20,确认输出变化;这一步只是数据实验,还没有发放金币。
RouteLights 末尾 · 字典实验Luau
local settings = {
    reward = 10,
    pauseSeconds = 1,
    activeColor = Color3.fromRGB(90, 220, 150),
}
print("Reward preview:", settings.reward)

Step by step

04 · 同一段动作,依次交给三个路标

下面的完整脚本把“要处理谁”和“要做什么”分开。route 负责对象顺序,循环体负责改变颜色。

WaitForChild(name) 用字符串寻找对象。名字拼错时,它会一直等,并可能在 Output 提醒 Infinite yield;那不是程序很慢,而是对象路径需要检查。

  1. 用完整代码替换 RouteLights。
  2. Play 后等待路标按顺序点亮,每个路标只亮一秒。
  3. Stop 后只改 route 顺序,不动循环体,验证路线跟着改变。
ServerScriptService > RouteLights · 完整脚本Luau
local route = {"Camp", "Bridge", "Cave"}
local settings = {
    pauseSeconds = 1,
    activeColor = Color3.fromRGB(90, 220, 150),
}

for index, name in ipairs(route) do
    local marker = workspace:WaitForChild(name)
    local originalColor = marker.Color
    print("Stop", index, name)
    marker.Color = settings.activeColor
    task.wait(settings.pauseSeconds)
    marker.Color = originalColor
end
print("Route complete")

Step by step

05 · 改数据,不乱改结构

增加第四站需要同时增加场景对象和列表项。只加字符串,没有对应的 Part,程序找不到它;只加 Part,没有加入列表,它就不会点亮。

列表连续排列时,table.insert(route, "Tower") 可追加一项;table.remove(route, 2) 会删除第二项,并让后面的项目向前移动。

  1. 添加 Anchored 的 Tower,再把 "Tower" 加到 route 末尾。
  2. 确认 Output 有 1、2、3、4 四站。
  3. 试着读 route[99],结果为 nil;不要接着对 nil 修改 Color。

Homework

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

1 四站寻宝

建立第四个路标,把路线改成 Camp → Cave → Bridge → Tower。

2 慢一点更清楚

只调整 settings.pauseSeconds,让每站亮两秒。

3 选做:第二轮路线

用函数包装点亮过程,传入不同的路线表,再运行一次。

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

Exit questions

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

本课 route[1] 是什么?

字符串 Camp;它不是 Part 本身,需要用这个名字寻找对应对象。

为什么用 ipairs 而不是依赖 pairs 顺序?

路线需要按连续的数字索引依次处理。

settings.reward 是金币系统吗?

还不是,只是一个保存数字的字段。实际给玩家加金币将在第 10 课实现。

新增路标只改数组够不够?

不够,还需要在正确路径创建同名 Part。

Explore further

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

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