Roblox Studio · 第 27 课

声音与粒子:给成功一个清楚的反馈

组合提示文字、轻量粒子与可选音效,让收集成功看得见、听得见,也不会刷屏。

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

Course overview

一次成功,给出短而清楚的文字、光点和声音。

玩家完成动作后,需要知道游戏有没有收到。一个短暂粒子、清楚文字和可选的轻音效,就能让反馈更容易理解。

反馈不应该比玩法还吵。这节课做一次只发 20 个粒子的练习,不让粒子无限喷发,也不要求你下载任何陌生音频。

01 · BEFORE

开始之前

会用 ProximityPrompt 和 busy。新建 Lesson27 Baseplate。

02 · MAKE

你的作品

按提示后显示成功文字、发出一小簇粒子;可选播放有权限使用的音效。

03 · CHECK

完成标志

连续操作不会叠出大量效果;没有音频资源时,文字和粒子仍正常。

官方粒子颜色效果参考,非本课完成画面
图 27-1:官方粒子颜色参考:先让一次 Emit 有清楚的反馈,再微调颜色和数量;这不是本课奖励台成品。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Learning route

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

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

1

01 · 在同一个 Part 中整理效果

创建 FeedbackPad,并添加 Prompt、Attachment、ParticleEmitter 和 Sound。把 ParticleEmitter 放在 Attachment 下,方便确定粒子发射位置。

2

02 · 先准备不依赖声音的文字

用 BillboardGui 在站台上方显示状态。文字能帮没有开声音的玩家确认结果,不把“听到了吗”作为唯一验收。

3

03 · Emit 一次,不让效果一直开着

Enabled=false 不妨碍用 Emit(20) 发出一次粒子。这样你准确控制本次效果数量,而不是一直打开 Rate 喷射。

4

04 · 控制数量,比堆效果更重要

Lifetime 决定粒子能活多久,Speed 决定速度。数量多、寿命长,画面同时存在的粒子就更多,设备也需要处理更多东西。

5

05 · 静音和快速重复都试一次

关闭电脑或游戏音量,重新操作,文字仍应说明发生了什么。再连续按提示,确认忙碌期间不会叠加多轮效果。

Step by step

01 · 在同一个 Part 中整理效果

创建 FeedbackPad,并添加 Prompt、Attachment、ParticleEmitter 和 Sound。把 ParticleEmitter 放在 Attachment 下,方便确定粒子发射位置。

音频只使用你自己有权使用、且该体验有访问权限的资源。不随便复制网页上的 SoundId,也不把音频无法加载当成代码必然错误。

  1. FeedbackPad:Size=6,1,6,Position=0,0.5,-10,Anchored=true。
  2. 添加 ProximityPrompt,ActionText=测试反馈、MaxActivationDistance=10。
  3. 添加 Attachment:BurstPoint,Position=0,2,0;在里面放 ParticleEmitter:Burst。
  4. Burst.Enabled=false,Lifetime=0.5 到 0.8,Speed=4 到 6,SpreadAngle=45,45;Texture 可用内置 rbxasset://textures/particles/sparkles_main.dds。
  5. 在 FeedbackPad 内添加 Sound:SuccessSound,Volume=0.25,SoundId 先留空;再添加 Script:Feedback。
SoundId 属性输入位置的官方截图
图 27-2:官方 SoundId 属性截图:只使用自己有权使用的音频;没有可用音频时留空,仍能完成本课。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Step by step

02 · 先准备不依赖声音的文字

用 BillboardGui 在站台上方显示状态。文字能帮没有开声音的玩家确认结果,不把“听到了吗”作为唯一验收。

本课是共享反馈台:一个人激活,附近其他玩家也能看见效果,所以使用一把全局 busy 锁。

  1. 阅读脚本中创建 BillboardGui 的部分。
  2. 文字先显示“准备好”,触发后改为“测试成功!”,一秒后恢复。

Step by step

03 · Emit 一次,不让效果一直开着

Enabled=false 不妨碍用 Emit(20) 发出一次粒子。这样你准确控制本次效果数量,而不是一直打开 Rate 喷射。

如果 SoundId 为空就跳过声音。即使资源没有权限,文字和粒子也应该是有效反馈,不能为了等音频加载而卡住机关。

  1. 粘贴完整脚本。
  2. Play 后按提示,观察文字和短粒子。
  3. 有合适音频时再设置 SoundId,保持音量轻柔。
Workspace > FeedbackPad > Feedback(Script)Luau
local pad = script.Parent
local prompt = pad:WaitForChild("ProximityPrompt")
local burst = pad:WaitForChild("BurstPoint"):WaitForChild("Burst")
local sound = pad:WaitForChild("SuccessSound")
local busy = false
local board = Instance.new("BillboardGui")
board.Size = UDim2.fromOffset(220, 56)
board.StudsOffset = Vector3.new(0, 4, 0)
board.AlwaysOnTop = true
board.Adornee = pad
board.Parent = pad
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.TextSize = 24
label.Text = "准备好"
label.Parent = board

prompt.Triggered:Connect(function(player)
    if busy then return end
    local character = player.Character
    local root = character and character:FindFirstChild("HumanoidRootPart")
    local hum = character and character:FindFirstChildOfClass("Humanoid")
    if not root or not hum or hum.Health <= 0 then return end
    if (root.Position - pad.Position).Magnitude > 12 then return end
    busy = true
    label.Text = "测试成功!"
    burst:Emit(20)
    if sound.SoundId ~= "" then sound:Play() end
    task.wait(1)
    label.Text = "准备好"
    busy = false
end)

Step by step

04 · 控制数量,比堆效果更重要

Lifetime 决定粒子能活多久,Speed 决定速度。数量多、寿命长,画面同时存在的粒子就更多,设备也需要处理更多东西。

不要用快速强烈闪烁表达普通成功。短而柔和的反馈更适合长时间游玩,关闭声音后也应看得懂。

  1. 比较 Emit(10) 与 Emit(20),选择能看清的一档。
  2. 把音量从 0.25 开始试,不用最大音量。
  3. 只在确认资源有权访问后设置 SoundId。

Step by step

05 · 静音和快速重复都试一次

关闭电脑或游戏音量,重新操作,文字仍应说明发生了什么。再连续按提示,确认忙碌期间不会叠加多轮效果。

如果粒子不显示,先查 Attachment 路径、Texture 和发射位置;如果只有声音失败,检查资源权限与 Output。

  1. 静音测试一次。
  2. 快速连按五次,确认反馈不无限叠加。
  3. 在设备模拟的较小视野中观察粒子是否挡住道路。

Homework

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

1 三种反馈方式

说明文字、粒子和声音各帮助玩家确认什么。

2 更轻的效果

把粒子减到 10 个,确认成功状态依然清楚。

3 选做:配色

选一种与营地主题一致的粒子颜色,不用增加数量来显眼。

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

Exit questions

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

Enabled=false 还能 Emit 吗?

能,关闭持续发射后仍可手动发出指定数量。

没有 SoundId 会影响文字吗?

不应该,本例会跳过声音,文字与粒子独立运行。

为什么不能随便复制音频 ID?

资源可能受版权或体验访问权限限制。

增加 Lifetime 会怎样?

粒子停留更久,同一时刻可能有更多粒子需要显示。

Explore further

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

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