Dalam game 3D multiplayer, audio memegang peranan penting dalam menciptakan imersi. Efek suara 2D datar yang terdengar menembus tembok tanpa peredaman merusak pengalaman bermain.
Roblox menyediakan fitur mumpuni melalui SoundService. Dengan mengatur SoundGroups, kurva RollOff, dan raycast untuk filter LowPass, Anda dapat menghadirkan kualitas audio 3D kelas atas.
1. Hierarki SoundGroups dan Struktur Mixing Profesional
Mengatur bus audio agar suara efek dan musik tetap seimbang:
- Struktur Bus Utama: Pengelompokan Master -> SFX, Ambient, Music, UI, dan Voice.
- Audio Ducking Dinamis: Menurunkan volume musik otomatis saat ada dialog penting.
- Efek DSP Bersama: Memasang reverb dan equalizer pada grup induk.
- Optimasi: Menempatkan suara UI 2D langsung di SoundService.
2. Atenuasi Jarak 3D dan Kurva RollOff
Perambatan suara secara fisik untuk deteksi arah yang akurat:
- RollOffMode: InverseTapered memberikan penurunan volume yang paling realistis.
- Jarak Min dan Max: Penyesuaian jarak redam berdasarkan jenis suara.
- Posisi Pendengar: Mengunci pendengar ke kepala karakter pada sudut pandang orang ketiga.
- Penempatan Workspace: Suara 3D wajib berada di bawah Part atau Attachment.
--!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. Oklusi Suara Raycast: Efek Meredam di Balik Tembok
Mencegah suara langkah kaki terdengar jernih saat terhalang tembok tebal:
- Pengecekan Garis Pandang: Menembakkan raycast antara sumber suara dan pendengar.
- Penyaringan LowPass: Menurunkan frekuensi ke 1200 Hz saat terhalang.
- Karakteristik Material: Redaman lebih besar pada beton dibanding kayu.
- Pengurangan Beban CPU: Evaluasi berkala setiap 100 ms.
4. Zona Reverb Lingkungan Dinamis
Peralihan gema yang mulus antara gua, koridor, dan ruang terbuka:
- Preset Bawaan: Pemanfaatan Cave, ConcertHall, dan StoneCorridor.
- Area Pemicu: Transisi halus saat pemain berpindah ruangan.
- Reverb Terlokalisasi: Mengisolasi pantulan suara pada ruangan tertentu.
- Akustik Bawah Air: Pengurangan nada dan frekuensi tinggi saat menyelam.
5. Manajemen Kanal Audio dan Efisiensi Mobile
Memastikan suara stabil tanpa terpotong di perangkat ponsel:
- Batas Saluran Suara: Perangkat ponsel memiliki batasan 32-64 channel.
- Penghentian Jarak Jauh: Menghentikan suara yang berada di luar jangkauan.
- File Mono: Menghemat memori dan mencegah tabrakan fase suara.
- Preload Terencana: Memuat suara penting lebih awal dengan PreloadAsync.
Frequently Asked Questions
Mengapa harus file audio mono untuk suara 3D?
File stereo memakan memori ganda dan sering mengalami pembatalan fase saat diposisikan di ruang 3D.
Apakah raycast audio menyebabkan lag?
Jika dibatasi hanya untuk suara dekat, proses ini memakan waktu kurang dari 0.1 ms per frame.
Bagaimana agar BGM tidak ikut bergema di dalam gua?
Pisahkan BGM ke dalam SoundGroup khusus yang tidak terhubung ke efek lingkungan.