一种服务,该如何 Sounds 在游戏中播放。 SoundService 也常用于存储 SoundGroups ,尽管这不是 SoundGroups 的必要组成部分。
SoundService 可以做什么?
SoundService 属性,例如 SoundService.AmbientReverb、SoundService.DistanceFactor、SoundService.DopplerScale 和 1> Class.SoundService.RolloffScale1> 可以用来改变游戏中所有 4> Class.Sound|Sounds4> 的播放方
Class.SoundService:SetListener() 函数允许开发人员设置声音从哪里听到的位置。
SoundService:PlayLocalSound() 可以用于在任何地方父级的音效上播放声音。
开发人员想了解更多关于声音在 Roblox 如何工作的方法,应该参阅提供给 FMOD 音效引擎 的文档。
代码示例
local Players = game:GetService("Players")
local CollectionService = game:GetService("CollectionService")
local SoundService = game:GetService("SoundService")
local localPlayer = Players.LocalPlayer
local reverbTags = {
["reverb_Cave"] = Enum.ReverbType.Cave,
}
-- collect parts and group them by tag
local parts = {}
for reverbTag, reverbType in pairs(reverbTags) do
for _, part in pairs(CollectionService:GetTagged(reverbTag)) do
parts[part] = reverbType
end
end
-- function to check if a position is within a part's extents
local function positionInPart(part, position)
local extents = part.Size / 2
local offset = part.CFrame:PointToObjectSpace(position)
return offset.x < extents.x and offset.y < extents.y and offset.z < extents.z
end
local reverbType = SoundService.AmbientReverb
while true do
task.wait()
if not localPlayer then
return
end
local character = localPlayer.Character
-- default to no reverb
local newReverbType = Enum.ReverbType.NoReverb
if character and character.PrimaryPart then
local position = character.PrimaryPart.Position
-- go through all the indexed parts
for part, type in pairs(parts) do
-- see if the character is within them
if positionInPart(part, position) then
-- if so, pick that reverb type
newReverbType = type
break
end
end
end
-- set the reverb type if it has changed
if newReverbType ~= reverbType then
SoundService.AmbientReverb = newReverbType
reverbType = newReverbType
end
end
local ServerScriptService = game:GetService("ServerScriptService")
local SoundService = game:GetService("SoundService")
-- Create custom plugin button
local toolbar = plugin:CreateToolbar("Empty Script Adder")
local newScriptButton = toolbar:CreateButton("Add Script", "Create an empty Script", "rbxassetid://1507949215")
local function playLocalSound(soundId)
local sound = Instance.new("Sound")
sound.SoundId = soundId
SoundService:PlayLocalSound(sound)
sound.Ended:Wait()
sound:Destroy()
end
local function onNewScriptButtonClicked()
-- Create new empty script
local newScript = Instance.new("Script")
newScript.Source = ""
newScript.Parent = ServerScriptService
playLocalSound("rbxassetid://0") -- Insert audio asset ID here
end
newScriptButton.Click:Connect(onNewScriptButtonClicked)
概要
属性
方法
GetListen 返回当前 SoundService 听众类型和已设置为听众。
在本地播放一个 Sound,意味着声音只会由客户端调用此函数,无论它的父级在哪里。
将听器设置为 SoundService。
属性
AmbientReverb
Class.SoundService 使用的环境音效预设。
枚数.ReverbType 这个属性模拟各种不同的环境对声音的影响。 每个不同的选项都与 FMOD 声音引擎中可用的预设配置相对应。 例如,当 AmbientReverb 设置为 Hangar 时,声音将以不同的方式重复,以模拟在大空间中。
改变 AmbientReverb 效果会影响 Roblox 的声音引擎使用的以下属性。
- 反射时间
- 初始反射延迟时间
- 与初始反射相比的延迟时间
- 参考高频
- 高频到中频衰减时间比率
- 在后期反弹中控制回声密度的值
- 在后期衰减中控制模态密度的值
- 参考低频
- 低频时相对房间效果等级
- 高频时相对房间效果等级
- 早期反射级与房间效果
- 中频效果等级
对于想要了解更多关于环境反射预设的信息,请参阅FMOD文档。 但对于大多数开发人员来说,Enum.ReverbType 名称已经足以使用此设置,无需任何高级知识。
代码示例
local Players = game:GetService("Players")
local CollectionService = game:GetService("CollectionService")
local SoundService = game:GetService("SoundService")
local localPlayer = Players.LocalPlayer
local reverbTags = {
["reverb_Cave"] = Enum.ReverbType.Cave,
}
-- collect parts and group them by tag
local parts = {}
for reverbTag, reverbType in pairs(reverbTags) do
for _, part in pairs(CollectionService:GetTagged(reverbTag)) do
parts[part] = reverbType
end
end
-- function to check if a position is within a part's extents
local function positionInPart(part, position)
local extents = part.Size / 2
local offset = part.CFrame:PointToObjectSpace(position)
return offset.x < extents.x and offset.y < extents.y and offset.z < extents.z
end
local reverbType = SoundService.AmbientReverb
while true do
task.wait()
if not localPlayer then
return
end
local character = localPlayer.Character
-- default to no reverb
local newReverbType = Enum.ReverbType.NoReverb
if character and character.PrimaryPart then
local position = character.PrimaryPart.Position
-- go through all the indexed parts
for part, type in pairs(parts) do
-- see if the character is within them
if positionInPart(part, position) then
-- if so, pick that reverb type
newReverbType = type
break
end
end
end
-- set the reverb type if it has changed
if newReverbType ~= reverbType then
SoundService.AmbientReverb = newReverbType
reverbType = newReverbType
end
end
DefaultListenerLocation
DistanceFactor
当计算 3D Sound 音量估算时,考虑到所有因素的影响。
默认情况下,距离因素是 3.33。这意味着,为了音量抵消目的,计量器将被视为 3.33 格。距离因素越大,抵消的音量就越多。
local SoundService = game:GetService("SoundService")SoundService.DistanceFactor = 1 -- 1 meter = 1 studSoundService.DistanceFactor = 10 -- 1 meter = 10 studs
开发人员建议只要使用不同的缩放,例如使用更大的自定义角色时,开发人员可以更改此属性。例如,使用更大的自定义角色时,开发人员可以减少距离因素。在所有其他情况下,Sound 设置,例如Sound.RollOffMode,应该使用。
想要了解更多关于 Roblox 3D 声音如何工作的人,应该查阅 FMOD 文档。
DopplerScale
这个属性决定3DSound对象的倾斜度与 Doppler 效果有多少。
谐振效果描述一个现象,在声音的源和观察者离开的情况下,声音的高度会改变,或者离得更近,或者离得更远。 谐振效果通常可以在现实生活中观看,例如当汽车驾驶过去时。
将此值提高可以使 Doppler 效果的影响过度,而将其降低可以使其最小化。 默认情况下,此属性的值为 1。
local SoundService = game:GetService("SoundService")SoundService.DopplerScale = 1 -- defaultSoundService.DopplerScale = 2 -- exaggerated Doppler effectSoundService.DopplerEffect = 0.5 -- subdued Doppler effect
注意,Doppler效果对2DSounds,(Sounds不是父级别的BasePart或1>Class.Configuration1>).
欲了解更多关于 Roblox 音效引擎使用的不同设置的文档,请参阅 FMOD 文档。
RespectFilteringEnabled
Class.Sound:Play() 播放从客户端复制到服务器,因此从服务器。在其他 words,当 Sound 调用 LocalScript 并且此属性是 1> true1> ,声音只会在相应客户端上播放。如果属性是 false,其他客
RolloffScale
设置 3D Sound 音量减少速度或“滚动关闭”。
注意,此属性仅适用于 Sounds 的子 Sound.RollOffMode 设置为“反向”或“逆向Tapered”。 “Linear”和“LinearSquare”
RolloffScale 越高,3D 音效的音量就越快,因为音效的音量会随着距离从听众到声音增加。
默认情况下,卷轴向下移动设置为 1,这在模拟现实世界中使用。
local SoundService = game:GetService("SoundService")SoundService.RolloffScale = 1 -- attenuation simulates real worldSoundService.RolloffScale = 2 -- sound attenuates twice as fast as the real world
欲了解更多关于 Roblox 音效引擎使用的不同设置的文档,请参阅 FMOD 文档。
VolumetricAudio
方法
GetListener
此函数返回 SoundService 当前听器类型和已设置为听器。
第一个返回的结果是Enum.ListenerType,其次要结果取决于 ListenerType:
<tbody><tr><td><code>enum.听取器类型.Camera</code></td><td>不会将听众对象作为 <code>工作区/当前相机</code> 总是使用</td></tr><tr><td><code>enum.听取器类型.CFrame</code></td><td>返回 <code>Datatype.CFrame</code> 用于 Class.SoundService:SetListener()</td></tr><tr><td><code>枚列听器类型对象位置</code></td><td>返回 <code>Class.SoundService:SetListener()</code> 中使用的 Class.BasePart</td></tr><tr><td><code>enum.听取器类型.ObjectCFrame</code></td><td>返回 <code>Class.SoundService:SetListener()</code> 中使用的 Class.BasePart</td></tr></tbody>
听众类型 | 描述 |
---|
Class.SoundService:SetListener() 可以用来更改听众。
local SoundService = game:GetService("SoundService")SoundService:SetListener(Enum.ListenerType.CFrame, CFrame.new(0, 0, 0))local listenerType, listener = SoundService:GetListener()print(listenerType, listener)
什么是听取器?
听器确定游戏中的音频是否被玩家“听”到。 对于3D Sounds (与基础零件或 Attachment 相关) ,听器会影响音效的音量和左/右平衡。 听器对2D音效的播放没有影响,因为它们没有发射位置。
默认情况下,听器设置为当前相机。 但是,可以使用一系列不同类型的听器。
返回
当前 Enum.ListenerType 和听众设置。 取决于 Enum.ListenerType 的听众可能是一个 BasePart ,一个 1> Datatype.CFrame1> 或零。
OpenAttenuationCurveEditor
参数
返回
OpenDirectionalCurveEditor
参数
返回
PlayLocalSound
在本地播放一个 Sound,意味着声音只会由客户端调用此函数,无论它的父级在哪里。此函数对于在 Studio 客户端播放本地 Sound 非常有用,例如在 Script 中。
参数
返回
代码示例
local ServerScriptService = game:GetService("ServerScriptService")
local SoundService = game:GetService("SoundService")
-- Create custom plugin button
local toolbar = plugin:CreateToolbar("Empty Script Adder")
local newScriptButton = toolbar:CreateButton("Add Script", "Create an empty Script", "rbxassetid://1507949215")
local function playLocalSound(soundId)
local sound = Instance.new("Sound")
sound.SoundId = soundId
SoundService:PlayLocalSound(sound)
sound.Ended:Wait()
sound:Destroy()
end
local function onNewScriptButtonClicked()
-- Create new empty script
local newScript = Instance.new("Script")
newScript.Source = ""
newScript.Parent = ServerScriptService
playLocalSound("rbxassetid://0") -- Insert audio asset ID here
end
newScriptButton.Click:Connect(onNewScriptButtonClicked)
SetListener
设置客户端使用的听器。
第一个参数是听器的 Enum.ListenerType,第二个参数取决于听器输入。
- Camera ListenerType - 不会将听鉴器对象返回为 Workspace.CurrentCamera 是 always 使用
- CFrame ListenerType - 使用 CFrame 的
- ObjectPosition 列听器类型 - 将被使用的 BasePart
- ObjectCFrame 列enerType - 用于使用的基础部分
Class.SoundService:Getlistener() 可以用来获取听众:
local SoundService = game:GetService("SoundService")SoundService:SetListener(Enum.ListenerType.CFrame, CFrame.new(0, 0, 0))local listenerType, listener = SoundService:GetListener()print(listenerType, listener)
什么是听取器?
Class.SoundService 听器确定游戏中的音频从哪里被玩家听到。对于 3D Sounds (与基础零件或 Attachment 关联) 的听器,听器会影响音效的音量和左/右平衡。听器对 2D 音效的播放没有影响,因为它们没有发射位置。
默认情况下,听器设置为当前相机。 但是,可以使用一系列不同类型的听器。
参数
enum.听取器类型 的听取器。
依赖 Class.BasePart 或 BasePart 或 CFrame 或 1>CFrame1> 或 4>Camera4> 或 7>Camera7> 或 0>Camera0> 或 3>Camera3> 或 6>Camera6> 或 Enum.ListenerType9> 或 2>Camera2> 或 5>Camera5> 或 Enum.ListenerType8> 或 1>Camera1> 或 4>