音频播放通过 Sound 对象进行,这些对象在体验中发出音频。Roblox 为每个 音频资产 分配一个唯一 ID,您可以将其分配给 Sound 对象以播放特定的音效或音乐曲目。您可以设置该音频在运行时自动播放,或通过 脚本触发它播放。
要修改多个 Sound 对象的播放,您可以将它们分配给 声音组,并控制整个组的音量,以及应用 动态效果。
创建声音对象
您可以在三个位置创建 Sound 对象,每个位置决定音频的发出方式和音量相对于用户在体验中的位置的变化。
| 位置 | 音频发出方式 | 音量变化 |
|---|---|---|
| 块、球体或圆柱体 BasePart 的子对象。 | 音频从整个部件的表面向外发出。 | 音量变化取决于用户的声音监听器与部件位置之间的距离,以及其大小。 |
| Attachment、MeshPart、TrussPart、WedgePart 或 CornerWedgePart 的子对象。 | 音频从单一的附着点或部件中心向外发出。 | 音量变化取决于用户的声音监听器与附着物/部件位置之间的距离。 |
| 在 SoundService 或 Workspace 内。 | 音频在整个体验中发出。 | 音量和声相位置保持不变,无论用户的声音监听器位置或旋转如何。 |
位置音频
位置音频是用户只能在体验中特定位置附近听到的音频。您可以利用两种类型的位置音频:体积音频和点声源音频。
体积音频
体积音频是最真实的音频选项,因为它动态变化,取决于用户与音频源的位置关系。例如,如果用户在一个带有子 Sound 对象的 BasePart 内,音频在用户周围播放,类似于耳机中的音乐在每个扬声器中的音量相同。当用户退出部件时,音频逐渐减小音量,并变得更具方向性,当听者旋转时,音频会围绕用户的头移动。有关控制音频在距离部件不同位置时的响度的属性的信息,请参见 RollOffMinDistance 和 RollOffMaxDistance。
BasePart 的大小也会影响音频的音量,因为较大的 BaseParts 产生更广的区域,用户可以听到音频,并且当用户从大型 BasePart 移动时,音量减小得更慢。以下示例显示一个大小如同城市的 BasePart,其中播放着环境音频的 Sound 对象。用户 A 和 B 体验音频的方式不同:用户 B 更接近大型 BasePart,他们在两个扬声器中听到的音频响度基本相同。相反,用户 A 更远离城市,因此他们听到的音频比用户 B 更安静,更具方向性,在每个扬声器中的响度不同。

体积音频适用于任何需要围绕用户沉浸式的音频,并根据用户的位置动态变化的音频,例如音乐会舞台或雨滴等氛围区域。当您尝试将 Sound 对象放置在不同大小和与用户的距离的 BaseParts 上时,您可以听到体积音频是多么沉浸。
要创建用于体积音频的 Sound 对象:
在 资源管理器 窗口中,选择 SoundService。
在 属性 窗口中,导航到 VolumetricAudio 属性,然后将其设置为 Enabled。
在 资源管理器 窗口中,将鼠标悬停在一个 BasePart 上,然后单击 ⊕ 按钮。会显示上下文菜单。
从菜单中插入 Sound。
在 属性 窗口中,导航到 SoundId 属性,输入有效的 音频资产 ID。

(可选) 如果您希望音频在体验开始时开始播放,请启用 Playing 属性。
点声源
与体积音频相反,点声源音频仅从单个点源发出。这种类型的音频适用于爆炸、冲击声音、电子设备和对话。
要创建用于点声源音频的 Sound 对象:
- 在 资源管理器 窗口中,将鼠标悬停在附件、桁架、楔形或角楔上,然后单击 ⊕ 按钮。会显示上下文菜单。
- 从菜单中插入 Sound。
- (可选) 如果您希望音频在体验开始时开始播放,请启用 Playing 属性。
背景音频
背景音频无论用户在体验中在哪里旅行,都以相同的音量播放。这种类型的音频适合希望对用户播放的音乐,特别是在您想要创建多个音频文件的配乐时。
为了组织目的,最好将所有用于背景音频的 Sound 对象保存在 Workspace 的单个位置,因为在您的体验中不断添加和编辑音频。以下示例将新创建的 Sound 对象存储在 SoundService 容器下,因为该服务决定了 Sound 对象如何在体验中播放。
要创建用于背景音频的 Sound 对象:
- 在 资源管理器 窗口中,将鼠标悬停在 SoundService 上,然后单击 ⊕ 按钮。会显示上下文菜单。
- 从菜单中插入 Sound。
- (可选) 如果您希望音频在体验开始时开始播放,请启用 Playing 属性。
自定义声音对象
Sound 对象属性共同影响用户体验音频的方式,例如:
- 他们分别听到特定音频的响度和相互之间的关系(音量)。
- 他们可以听到的音频部分(TimePosition)。
- 他们听音频的速度和音高(PlaybackSpeed)。
- 音频是否在完成时自动重播(Looped)。
音量
Volume 属性允许您将音频的音量设置为 0(静音)到 10(震撼)。如果您希望一次更改多个 Sound 对象的音量,请将它们放在一个 声音组 下。
RollOffMinDistance 和 RollOffMaxDistance
RollOffMinDistance 和 RollOffMaxDistance 决定用户从位置音频感知音量的范围。对于体积音频,RollOffMinDistance 是音频在客户端听者 远离 父 BasePart 时开始减少音量的最小距离(以 studs 为单位),而 RollOffMaxDistance 属性是客户端听者可以从物体表面听到音频的最大距离(以 studs 为单位)。

对于点声源音频,RollOffMinDistance 和 RollOffMaxDistance 与体积音频类似,但这些属性控制的跌落距离并不包围对象,它仅影响从点声源向外的距离。

RollOffMode
RollOffMode 属性允许您决定音频在用户听者与 Sound 对象的父项之间的距离增加时如何渐变。您可以将此属性设置为 Enum.RollOffMode 枚举中的四个值之一。

| RollOffMode | 描述 |
|---|---|
| Inverse(默认) | 音量最初在 RollOffMinDistance 处急剧下降,但当用户接近 RollOffMaxDistance 时,音量的减小变得更加渐进。一旦他们达到 RollOffMaxDistance,音频就会沉默。 |
| Linear | 音量在 RollOffMinDistance 和 RollOffMaxDistance 之间线性变化。一旦用户达到 RollOffMaxDistance,音频就会沉默。 |
| InverseTapered | 音量在接近 RollOffMinDistance 时遵循逆模型,在接近 RollOffMaxDistance 时遵循线性平方模型。音频在最大距离点接近沉默。 |
| LinearSquare | 音量在 RollOffMinDistance 和 RollOffMaxDistance 之间按线性平方关系变化。音频在最大距离点接近沉默。 |
PlaybackSpeed
PlaybackSpeed 属性允许您确定音频播放的速度。例如,如果您将 PlaybackSpeed 设置为 2,您的音频将以两倍速播放,并且音高提升一个八度。同样,如果您将其设置为 0.5,音频将以一半的速度播放,音高降低一个八度。
| PlaybackSpeed = 0.5 | PlaybackSpeed = 1.0 | PlaybackSpeed = 2.0 |
TimePosition
TimePosition 属性以秒为单位显示用户目前在音频样本中的位置。此属性对仅播放音频样本的某一部分或在音频达到特定位置时触发事件非常有用。例如,以下代码样本导致粒子发射器在音轨的有限时间范围内,在部件上方发出白色光环粒子。
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
-- 创建一个新部件
local part = Instance.new("Part")
part.Anchored = true
part.Color = Color3.new(0.75, 0.2, 0.5)
part.Size = Vector3.new(2, 1, 2)
part.Material = Enum.Material.Neon
part.Position = Vector3.new(0, 4, 0)
part.Parent = Workspace
-- 在部件上创建一个附件
local attachment = Instance.new("Attachment")
attachment.Position = Vector3.new(0, 0.5, 0)
attachment.Parent = part
-- 在附件上创建一个粒子发射器
local emitter = Instance.new("ParticleEmitter")
emitter.Rate = 5
emitter.Lifetime = NumberRange.new(1.5, 1.5)
emitter.Texture = "rbxassetid://1266170131"
emitter.Speed = NumberRange.new(1, 1)
emitter.Size = NumberSequence.new{NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(1, 6)}
emitter.Transparency = NumberSequence.new{NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(0.25, 0), NumberSequenceKeypoint.new(1, 1)}
emitter.Orientation = Enum.ParticleOrientation.VelocityPerpendicular
emitter.Parent = attachment
-- 在附件上创建一个声音
local sound = Instance.new("Sound")
sound.SoundId = "rbxassetid://1835405646"
sound.Parent = attachment
-- 播放声音
sound:Play()
-- 开始检查发射器是否应该启用
RunService.Heartbeat:Connect(function()
-- 在音频的时间范围内启用发射器;否则禁用它
emitter.Enabled = sound.TimePosition >= 5 and sound.TimePosition < 20
end)
Looped
Looped 属性允许您在音频播放完成后重复播放音频。当设置为 true 时,Sound 对象的音频将再次播放。这在 背景音频 中应用很有用,以确保您的体验不会有突兀的静音。
脚本声音对象
上下文播放音频
除了通过 Sound 对象的 Playing 属性自动播放音频外,您还可以通过在相应的 Sound 对象上调用 Play() 从 LocalScript 上下文中播放音频。例如:
local Workspace = game:GetService("Workspace")local sound = Instance.new("Sound")sound.SoundId = "rbxassetid://9120386436"sound.Looped = truesound.Parent = Workspacesound:Play()
或者,如果地方将包含多个曲目,您可以从 LocalScript 播放特定曲目:
local SoundService = game:GetService("SoundService")local musicTrack = SoundService:FindFirstChild("LucidDream")if not musicTrack.IsPlaying thenmusicTrack:Play()end
播放界面音频
您可以为 GuiObjects,例如 按钮,通过将 Sound 对象连接到 Activated 事件监听器来播放界面音频。这使您能够为用户提供听觉反馈,例如,当他们滑动或按下按钮时。
要在用户激活 TextButton 或 ImageButton 时播放 Sound 对象的音频:
local SoundService = game:GetService("SoundService")
local button = script.Parent
local sound = SoundService:FindFirstChild("SOUND_NAME")
if not sound.isLoaded then
sound.Loaded:Wait()
end
local function onButtonActivated()
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)