3D çok oyunculu oyunlarda yön hissi ve atmosfer için ses hayati önem taşır. Duvarların arkasından engelsizce duyulan 2D sesler oyunun gerçekçiliğini bozar.
Roblox SoundService güçlü araçlar sunar. SoundGroups yapısı kurarak, RollOff ayarlarını optimize ederek ve raycast ile duvar arkası sesleri boğuklaştırarak stüdyo kalitesinde ses elde edebilirsiniz.
1. SoundGroups Hiyerarşisi ve Ses Miksajı
Ses efektleri ve müziği dengeli yönetmek için kanal yapısı:
- Ana Kanal Ağacı: Master altında SFX, Ambient, Music, UI ve Voice ayrımı.
- Dinamik Kısma (Ducking): Konuşma anlarında arka plan müziğini otomatik azaltma.
- Ortak DSP Efektleri: Yankı ve filtreleri üst gruplara bağlama.
- Performans: Arayüz seslerini doğrudan SoundService içinde tutma.
2. 3D Mesafe Sönümlemesi ve RollOff Eğrileri
Doğal ses yayılımı ve doğru yön tayini:
- RollOffMode: Gerçekçi ses düşüşü için InverseTapered tercihi.
- Mesafe Sınırları: Ses türüne göre RollOffMinDistance ve MaxDistance ayarları.
- Dinleyici Konumu: Üçüncü şahıs kamerasında dinleyiciyi karakter kafasına bağlama.
- Konumsal Yerleşim: 3D sesleri Workspace içindeki Part veya Attachment altına koyma.
--!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. Raycast ile Ses Engelleme: Duvar Arkası Boğuklaşma
Ayak seslerinin kalın duvarlar arkasından net duyulmasını önleme:
- Görüş Çizgisi Kontrolü: Ses kaynağı ile dinleyici arasında ışın fırlatma.
- LowPass Filtresi: Duvar arkasında yüksek frekansları kesip 1200 Hz seviyesine çekme.
- Malzeme Ayrımı: Taş ve metal duvarlarda ahşaba kıyasla daha yoğun sönümleme.
- Aralıklı Çalıştırma: 100 ms periyotla hesaplayarak CPU yükünü düşürme.
4. Dinamik Çevresel Yankı (Reverb) Bölgeleri
Mağara, dar koridor ve açık alanlar arasında pürüzsüz geçiş:
- Hazır Ayarlar: Cave, ConcertHall ve StoneCorridor kullanımı.
- Tetikleyici Alanlar: Odaya girildiğinde yankı ayarlarını yumuşakça harmanlama.
- Bölgesel Yankı: Sadece belirli odalara özel yansımalar atama.
- Sualtı Efektleri: Suya dalındığında ton kalınlaştırma ve tiz kesimi.
5. Ses Kanalı Bütçesi ve Mobil Optimizasyon
Mobil cihazlarda ses kesilmesi yaşamadan kararlı performans:
- Kanal Sınırı: Mobil cihazlar 32-64 eşzamanlı ses çalabilir.
- Mesafe Elemesi: Duyulamayacak kadar uzaktaki sesleri durdurma.
- Mono Dosyalar: Bellek tasarrufu ve faz çakışmalarını önleme.
- Ön Yükleme: PreloadAsync ile kritik çatışma seslerini önden hazırlama.
Frequently Asked Questions
3D seslerde neden stereo yerine mono dosya kullanılır?
Stereo dosyalar iki kat bellek tüketir ve 3D alanda faz iptaline yol açabilir.
Ses için raycast yapmak oyunu kastırır mı?
Yalnızca yakındaki sesler için aralıklı tarandığında 0.1 ms'den az CPU harcar.
Müziğin mağara yankısından etkilenmesi nasıl önlenir?
Müziği ortam efektlerinden bağımsız ayrı bir SoundGroup içine yönlendirerek.