Roblox Studio · 第 8 课

用代码搭建:自动生成彩色阶梯

用 Instance.new、Vector3 和循环生成阶梯,控制间距与高度,并把作品整理进 Folder。

10–15 岁 60 分钟 Instance.new / Vector3 动手实践 测试与保存

Course overview

从一段配方,长出一条可以走上去的阶梯。

上节课让代码按顺序控制已有的路标。这次更进一步:让程序自己创建 Part,再计算每一级的位置。

你是这条阶梯的设计师。阶数、间距和高度都集中在脚本开头,改一个数字就能做出新版本。先做安全的小阶梯,再尝试更有挑战的路线。

01 · BEFORE

开始之前

理解 for、table、Position、Size 和 Anchored。新建 Lesson08 Baseplate。

02 · MAKE

你的作品

运行后自动生成六级阶梯,全部放进 GeneratedStairs 文件夹。

03 · CHECK

完成标志

Explorer 中正好六个 Step,阶梯不会掉落;Stop 后生成的对象消失。

BuildStairs 生成六级蓝绿色阶梯,Explorer 中显示 Step01 到 Step06
图 8-1 · Studio 实拍:运行完整脚本后生成六级阶梯。右侧 GeneratedStairs 中有 Step01–Step06,下方 Output 显示 Created steps: 6。最前面的绿色方块是出生点。

Learning route

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

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

1

01 · 留出空间,准备一张配方

本课不需要手动建立六个 Part。保留 Baseplate 和 SpawnLocation,在 ServerScriptService 建立 BuildStairs 即可。

2

02 · 创建对象,再设置属性

Instance.new("Part") 会创建一个新的 Part,但它还没有放进场景。把 Parent 设为 workspace 后,它才出现在 Workspace 中。

3

03 · 用索引算出每一级的位置

第 index 级的高度是 1 + index × RISE,前进距离是 -index × DEPTH。负 Z 方向是这张练习地图的前方,不代表所有相机画面的前方。

4

04 · 读懂两个新工具

% 是取余数。这里 (index - 1) % 2 + 1 交替得到 1、2、1、2,因此会轮流取出两种颜色。先在纸上算 index 为 1、2、3 时的结果。

5

05 · 看起来像楼梯,还要真的能走

编辑者可以飞着看模型,玩家却要受碰撞、跳跃和重力限制。只有从出生点走一遍,才能判断你的间距与高度是否合适。

Step by step

01 · 留出空间,准备一张配方

本课不需要手动建立六个 Part。保留 Baseplate 和 SpawnLocation,在 ServerScriptService 建立 BuildStairs 即可。

先从出生点朝前留出约 40 studs 的空地。运行时创建的楼梯属于测试副本;保存脚本就保存了配方,不会把测试中的物体自动保存到编辑场景。

  1. 新建普通 Script:ServerScriptService > BuildStairs。
  2. 保留 Baseplate 作为跌落后的安全地面。
  3. 先熟悉下面的 Vector3 例子,不必运行:Vector3.new(8, 1, 5) 表示 X 宽 8、Y 高 1、Z 长 5。
在 ServerScriptService 中插入 Script 的官方截图
图 8-2:官方插入脚本截图:找到 ServerScriptService 旁的加号,插入普通 Script,并命名为 BuildStairs。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Step by step

02 · 创建对象,再设置属性

Instance.new("Part") 会创建一个新的 Part,但它还没有放进场景。把 Parent 设为 workspace 后,它才出现在 Workspace 中。

先设置大小、位置和 Anchored,最后设置 Parent,可以让对象进入场景时就已经准备好。Name 是对象名字,不是创建它的类别。

  1. 先用短实验生成一个 Step。
  2. Play 时观察 Explorer,Stop 后观察它消失。
  3. 确认它在空中保持不动,说明 Anchored 生效。
ServerScriptService > BuildStairs · 单个对象实验Luau
local step = Instance.new("Part")
step.Name = "Step01"
step.Size = Vector3.new(8, 1, 5)
step.Position = Vector3.new(0, 2, -8)
step.Anchored = true
step.Parent = workspace

Step by step

03 · 用索引算出每一级的位置

第 index 级的高度是 1 + index × RISE,前进距离是 -index × DEPTH。负 Z 方向是这张练习地图的前方,不代表所有相机画面的前方。

完整脚本先创建 Folder,再把每一级放进去。这样你能折叠整条阶梯,也不会和手工搭建的 Part 混在一起。

  1. 替换 BuildStairs 的全部代码。
  2. Play 后展开 GeneratedStairs,确认 Step01 到 Step06。
  3. 走到第一阶,尝试跳到最高处。
ServerScriptService > BuildStairs · 完整脚本Luau
local COUNT = 6
local RISE = 1.5
local DEPTH = 5
local colors = {
    Color3.fromRGB(60, 160, 235),
    Color3.fromRGB(90, 210, 175),
}

local stairs = Instance.new("Folder")
stairs.Name = "GeneratedStairs"
stairs.Parent = workspace

for index = 1, COUNT do
    local step = Instance.new("Part")
    step.Name = string.format("Step%02d", index)
    step.Size = Vector3.new(8, 1, DEPTH)
    step.Position = Vector3.new(0, 1 + index * RISE, -index * DEPTH)
    step.Color = colors[(index - 1) % #colors + 1]
    step.Anchored = true
    step.Parent = stairs
end
print("Created steps:", #stairs:GetChildren())

Step by step

04 · 读懂两个新工具

% 是取余数。这里 (index - 1) % 2 + 1 交替得到 1、2、1、2,因此会轮流取出两种颜色。先在纸上算 index 为 1、2、3 时的结果。

string.format("Step%02d", index) 把数字写成两位,生成 Step01 这样的名字。它只是让 Explorer 更整齐,不会改变楼梯的行为。

  1. 把 colors 加入第三种颜色,观察颜色循环变成三种。
  2. 把 COUNT 改为 8,检查对象数量也变为 8。
  3. 保持同一时刻只有一个 BuildStairs 脚本,避免重叠生成。

Step by step

05 · 看起来像楼梯,还要真的能走

编辑者可以飞着看模型,玩家却要受碰撞、跳跃和重力限制。只有从出生点走一遍,才能判断你的间距与高度是否合适。

如果高度太大,先把 RISE 调回 1.5。如果楼梯散落,检查每个新 Part 是否设置 Anchored,而不是只给 Folder 起了一个“固定”的名字。

  1. 测试 COUNT=1 和 COUNT=8,两种规模都应正常生成。
  2. 验证改 RISE 只改变爬升,改 DEPTH 会同时改变平台长度和前进间距。
  3. Stop 后保存脚本。若想把生成物体保留为模型,需要另做明确的编辑流程,本课先不做。

Homework

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

1 八级彩虹阶梯

生成 8 级阶梯,使用三种交替颜色。

2 写出位置公式

算出第 4 阶的 Y、Z 坐标,再在运行中的 Properties 检查。

3 选做:宽度参数

新增 WIDTH 常量,把写死的宽度 8 替换为 WIDTH,并比较两种宽度。

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

Exit questions

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

Instance.new 创建后为何可能看不见?

对象还没有设置到可见场景的 Parent,或位置不在视野内。

为什么每一级都设置 Anchored?

固定是每个 Part 的属性,Folder 不会替所有子对象固定。

Stop 后阶梯消失,是丢失了吗?

不是。它由运行中的脚本生成,Stop 后测试副本被还原;脚本仍保留配方。

COUNT 改成 8,需要复制代码吗?

不需要,循环会按新的数量创建八级。

Explore further

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

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