开始之前
会用 ProximityPrompt 和 busy。新建 Lesson27 Baseplate。
Course overview
玩家完成动作后,需要知道游戏有没有收到。一个短暂粒子、清楚文字和可选的轻音效,就能让反馈更容易理解。
反馈不应该比玩法还吵。这节课做一次只发 20 个粒子的练习,不让粒子无限喷发,也不要求你下载任何陌生音频。
会用 ProximityPrompt 和 busy。新建 Lesson27 Baseplate。
按提示后显示成功文字、发出一小簇粒子;可选播放有权限使用的音效。
连续操作不会叠出大量效果;没有音频资源时,文字和粒子仍正常。

Learning route
每完成一小步,就测试一次。先说出你预计会看到什么,再用 Play 和 Output 检查,不用急着一次写完所有代码。
创建 FeedbackPad,并添加 Prompt、Attachment、ParticleEmitter 和 Sound。把 ParticleEmitter 放在 Attachment 下,方便确定粒子发射位置。
用 BillboardGui 在站台上方显示状态。文字能帮没有开声音的玩家确认结果,不把“听到了吗”作为唯一验收。
Enabled=false 不妨碍用 Emit(20) 发出一次粒子。这样你准确控制本次效果数量,而不是一直打开 Rate 喷射。
Lifetime 决定粒子能活多久,Speed 决定速度。数量多、寿命长,画面同时存在的粒子就更多,设备也需要处理更多东西。
关闭电脑或游戏音量,重新操作,文字仍应说明发生了什么。再连续按提示,确认忙碌期间不会叠加多轮效果。
Step by step
创建 FeedbackPad,并添加 Prompt、Attachment、ParticleEmitter 和 Sound。把 ParticleEmitter 放在 Attachment 下,方便确定粒子发射位置。
音频只使用你自己有权使用、且该体验有访问权限的资源。不随便复制网页上的 SoundId,也不把音频无法加载当成代码必然错误。

Step by step
用 BillboardGui 在站台上方显示状态。文字能帮没有开声音的玩家确认结果,不把“听到了吗”作为唯一验收。
本课是共享反馈台:一个人激活,附近其他玩家也能看见效果,所以使用一把全局 busy 锁。
Step by step
Enabled=false 不妨碍用 Emit(20) 发出一次粒子。这样你准确控制本次效果数量,而不是一直打开 Rate 喷射。
如果 SoundId 为空就跳过声音。即使资源没有权限,文字和粒子也应该是有效反馈,不能为了等音频加载而卡住机关。
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
Lifetime 决定粒子能活多久,Speed 决定速度。数量多、寿命长,画面同时存在的粒子就更多,设备也需要处理更多东西。
不要用快速强烈闪烁表达普通成功。短而柔和的反馈更适合长时间游玩,关闭声音后也应看得懂。
Step by step
关闭电脑或游戏音量,重新操作,文字仍应说明发生了什么。再连续按提示,确认忙碌期间不会叠加多轮效果。
如果粒子不显示,先查 Attachment 路径、Texture 和发射位置;如果只有声音失败,检查资源权限与 Output。
Homework
说明文字、粒子和声音各帮助玩家确认什么。
把粒子减到 10 个,确认成功状态依然清楚。
选一种与营地主题一致的粒子颜色,不用增加数量来显眼。
Exit questions
能,关闭持续发射后仍可手动发出指定数量。
不应该,本例会跳过声音,文字与粒子独立运行。
资源可能受版权或体验访问权限限制。
粒子停留更久,同一时刻可能有更多粒子需要显示。
Explore further
正文代码可以直接复制。先确认脚本类型、放置位置,以及这段代码是完整版本还是小实验;不要把同一脚本的多个版本叠加运行。界面参考图已标注来源,图中的对象名可能与本课不同,请以操作步骤为准。