Dans les jeux 3D multijoueurs, le son est essentiel pour situer les menaces. Des bruits de pas en 2D sans atténuation physique brisent immédiatement l'immersion.
Grâce à SoundService et aux Attachments, Roblox permet une gestion sonore de niveau professionnel. En structurant les SoundGroups et en appliquant une occlusion par raycast, l'acoustique devient ultra-réaliste.
1. Hiérarchie SoundGroups et mixage sonore
Organisation des bus sonores pour un équilibre parfait entre effets et musique :
- Bus racine : Structure Master -> SFX, Ambiance, Musique, UI et Voix.
- Ducking dynamique : Réduction automatique du volume musical pendant les dialogues.
- Chaînes d'effets globales : Placement d'égaliseurs et de compresseurs sur les groupes parents.
- Performance : Les sons d'interface restent en 2D dans le SoundService.
2. Atténuation spatiale 3D et courbes RollOff
Propagation physique du son pour une localisation spatiale précise :
- Mode RollOff : Privilégier InverseTapered pour une atténuation naturelle et douce.
- Distances min et max : Réglage précis selon l'intensité du son émis.
- Position du récepteur : Ancrage du listener sur la tête du personnage.
- Placement dans le monde : Lier les sons à des Parts ou Attachments dans le Workspace.
--!strict
local Workspace = game:GetService("Workspace")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local SpatialAudioManager = {}
type OccludedSound = { sound: Sound, emitterPart: BasePart, lowPass: LowPassSoundEffect, originalVolume: number }
local trackedSounds: { OccludedSound } = {}
local RAY_PARAMS = RaycastParams.new()
RAY_PARAMS.FilterType = RaycastFilterType.Exclude
function SpatialAudioManager.RegisterOccludedSound(sound: Sound, emitter: BasePart)
local lpf = sound:FindFirstChildOfClass("LowPassSoundEffect") or Instance.new("LowPassSoundEffect")
lpf.CutoffFrequency = 20000
lpf.Parent = sound
table.insert(trackedSounds, { sound = sound, emitterPart = emitter, lowPass = lpf, originalVolume = sound.Volume })
end
function SpatialAudioManager.UpdateOcclusion(camera: Camera)
local listenerPos = camera.CFrame.Position
RAY_PARAMS.FilterDescendantsInstances = { camera }
for _, item in ipairs(trackedSounds) do
if not item.sound.IsPlaying then continue end
local dir = item.emitterPart.Position - listenerPos
if dir.Magnitude > item.sound.RollOffMaxDistance then continue end
local hit = Workspace:Raycast(listenerPos, dir, RAY_PARAMS)
local occluded = hit and hit.Instance and hit.Instance ~= item.emitterPart and hit.Instance.CanCollide
local cutoff = occluded and 1200 or 20000
local vol = occluded and (item.originalVolume * 0.45) or item.originalVolume
TweenService:Create(item.lowPass, TweenInfo.new(0.25), { CutoffFrequency = cutoff }):Play()
TweenService:Create(item.sound, TweenInfo.new(0.25), { Volume = vol }):Play()
end
end
return SpatialAudioManager
3. Occlusion sonore par raycast : Filtrage à travers les murs
Atténuer les sons étouffés derrière les parois solides :
- Ligne de visée : Envoi de rayons entre la source sonore et l'auditeur.
- Filtre passe-bas : Baisse de fréquence à 1200 Hz pour étouffer le son derrière les murs.
- Prise en compte des matériaux : Amortissement plus fort pour la pierre que pour le bois.
- Fréquence de calcul : Exécution cadencée toutes les 100 ms.
4. Zones dynamiques de réverbération environnementale
Transitions acoustiques fluides entre extérieurs et salles fermées :
- Préréglages intégrés : Emploi de Cave, ConcertHall et StoneCorridor.
- Zones déclencheuses : Interpolation progressive des réglages de réverbération.
- Effets localisés : Application à des groupes de sons précis.
- Effets sous l'eau : Décalage de pitch et coupure des aigus en immersion.
5. Budget de voix audio et compatibilité mobile
Diffusion sonore sans coupure sur les appareils à ressources limitées :
- Limite de voix : Les mobiles gèrent entre 32 et 64 canaux en simultané.
- Arrêt par distance : Interrompre la lecture des sons trop éloignés.
- Fichiers mono : Économie de mémoire et suppression des déphasages.
- Préchargement sélectif : Chargement anticipé des bruits de pas et tirs.
Frequently Asked Questions
Pourquoi privilégier les fichiers mono pour les sons 3D ?
Le format stéréo consomme deux fois plus de mémoire et provoque des annulations de phase en 3D.
Le raycasting audio ralentit-il le serveur ?
Effectué côté client sur les sons proches, il consomme moins de 0.1 ms de CPU par image.
Comment isoler la musique des effets de réverbération ?
En la reliant à un SoundGroup dédié distinct des sons du monde.