Roblox Studio · 第 21 课

背包工具:制作随身手电筒

在 StarterPack 中创建 Tool 和 Handle,通过装备、使用与卸下事件控制 SpotLight。

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

Course overview

装备自己的手电筒,用一下开灯,再用一下关灯。

营地路灯不会跟着你走,手电筒可以。Tool 会把道具加入背包,并提供装备、使用和卸下这些事件。

先做一个简单的长方体手电,不下载未知的工具脚本。你能解释每个对象的用途,比拥有一个复杂模型更重要。

01 · BEFORE

开始之前

理解事件、boolean 和第 14 课灯光。新建 Lesson21 Baseplate。

02 · MAKE

你的作品

可装备的手电筒,使用时切换 SpotLight,卸下时自动关闭。

03 · CHECK

完成标志

工具不把角色钉住、不掉落;卸下再装备时灯保持关闭。

Tool 与 Handle 的官方场景截图
图 21-1:官方工具结构截图:Handle 是角色拿在手里的部件。先确认它没有 Anchored,再检查碰撞与重量设置。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Learning route

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

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

1

01 · Tool 必须有合适的 Handle

在 StarterPack 创建 Tool,玩家出生时它会进入背包。默认 RequiresHandle=true 时,需要一个名字精确为 Handle 的 BasePart。

2

02 · 先看光从哪一面出来

SpotLight.Face=Front 表示沿 Handle 的本地前面照射,不一定等于你想象的角色前方。工具的握持朝向由 Grip 等属性影响。

3

03 · 使用切换,卸下复位

Activated 表示玩家使用已装备工具,Unequipped 表示卸下。我们用一份 boolean 保留灯的状态,并让关闭逻辑集中在 turnOff。

4

04 · 背包、角色和模板的关系

未装备时,Tool 通常在玩家 Backpack 中;装备时,它移到 Character。StarterPack 中的是出生时使用的模板。

5

05 · 不让道具妨碍操作

手电不应该大到挡住整块屏幕,也不应该因为一个锚定属性让角色不能走。先检查体验,再加装饰。

Step by step

01 · Tool 必须有合适的 Handle

在 StarterPack 创建 Tool,玩家出生时它会进入背包。默认 RequiresHandle=true 时,需要一个名字精确为 Handle 的 BasePart。

Handle 不能 Anchored,否则可能影响角色移动。把它设为 CanCollide=false、Massless=true,减少它与角色和地面的物理冲突。

  1. 创建 StarterPack > Flashlight(Tool),CanBeDropped=false。
  2. 在 Flashlight 中创建 Part:Handle,Size=0.6,0.6,2,Anchored=false、CanCollide=false、Massless=true。
  3. 在 Handle 内创建 SpotLight:Beam,Enabled=false、Brightness=2、Range=24、Angle=55、Face=Front。
  4. 在 Flashlight 内创建普通 Script:FlashlightControl。
把工具放进 StarterPack 的 Explorer 截图
图 21-2:官方 StarterPack 截图:放在这里的 Tool 会成为玩家进入测试时可用的工具。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Step by step

02 · 先看光从哪一面出来

SpotLight.Face=Front 表示沿 Handle 的本地前面照射,不一定等于你想象的角色前方。工具的握持朝向由 Grip 等属性影响。

先用简单形状验证方向。若光照向脚下,调整 Tool 的握持朝向,而不是把亮度越调越大。

  1. 把 Lighting.ClockTime 临时调至 19,保留一点环境光。
  2. Play 后装备工具,从正面和侧面观察 Handle。
  3. 如果握持不合适,Stop 后小幅调整 Grip 的旋转,逐次测试。

Step by step

03 · 使用切换,卸下复位

Activated 表示玩家使用已装备工具,Unequipped 表示卸下。我们用一份 boolean 保留灯的状态,并让关闭逻辑集中在 turnOff。

这段普通 Script 在服务器改变灯,因此它是其他玩家也能看见的道具效果。单纯个人手电也可以有另一种设计,但不要混淆两种需求。

  1. 把完整代码放入 FlashlightControl。
  2. Play 后从背包选择 Flashlight,使用一次开灯,再使用一次关灯。
  3. 开灯后卸下工具,确认灯熄灭。
StarterPack > Flashlight > FlashlightControl(Script)Luau
local tool = script.Parent
local handle = tool:WaitForChild("Handle")
local light = handle:WaitForChild("Beam")
local isOn = false

local function turnOff()
    isOn = false
    light.Enabled = false
end

tool.Activated:Connect(function()
    local character = tool.Parent
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    if not humanoid or humanoid.Health <= 0 then return end
    isOn = not isOn
    light.Enabled = isOn
end)
tool.Unequipped:Connect(turnOff)
turnOff()

Step by step

04 · 背包、角色和模板的关系

未装备时,Tool 通常在玩家 Backpack 中;装备时,它移到 Character。StarterPack 中的是出生时使用的模板。

因此修改长期版本要在 Stop 后回到 StarterPack,而不是只改运行时背包里那份副本。角色重生后会重新得到模板中的工具。

  1. 运行时观察工具在 Backpack 与 Character 之间移动。
  2. 重置角色,确认重新获得手电筒。
  3. 检查新工具的灯默认是关闭状态。

Step by step

05 · 不让道具妨碍操作

手电不应该大到挡住整块屏幕,也不应该因为一个锚定属性让角色不能走。先检查体验,再加装饰。

如果添加外壳等额外零件,需要把它们用 WeldConstraint 连接到 Handle,并检查是否仍有 Anchored 的部分。初学版本先保留单个 Handle。

  1. 装备后走路、跳跃和转身,确认不受阻。
  2. 连续切换灯光,确认每次只改变一次。
  3. 双人观察时确认对方也能看见亮灯效果。

Homework

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

1 暖色手电

把 Beam.Color 改成柔和暖色,比较路面是否仍清楚。

2 合理范围

比较 Range=16 与 24,选一个适合营地大小的范围。

3 选做:状态名称

开灯时把 Tool.Name 改为“手电 · 开”,关灯时恢复,并检查背包文字。

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

Exit questions

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

Handle 为什么不能 Anchored?

被装备的工具需要随角色运动,锚定可能限制或破坏角色移动。

Activated 与 Equipped 是同一件事吗?

不是,Equipped 是装备,Activated 是使用已装备的工具。

为什么在 Unequipped 时关灯?

让工具回到明确的默认状态,避免卸下后仍留着效果。

编辑长期版本应该改哪里?

Stop 后修改 StarterPack 中的模板。

Explore further

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

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