← Back to Portal Hub

Roblox 3D Mekansal Ses Mühendisliği: SoundGroups Hiyerarşisi, Dinamik Reverb ve Raycast Engelleme

By DopaBrain Studio Engineering Team • 2026-09-30 • Technical Guide

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ı:

2. 3D Mesafe Sönümlemesi ve RollOff Eğrileri

Doğal ses yayılımı ve doğru yön tayini:

Luau Mekansal Ses Yöneticisi: Raycast Engelleme ve Reverb Kontrolü
--!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:

4. Dinamik Çevresel Yankı (Reverb) Bölgeleri

Mağara, dar koridor ve açık alanlar arasında pürüzsüz geçiş:

5. Ses Kanalı Bütçesi ve Mobil Optimizasyon

Mobil cihazlarda ses kesilmesi yaşamadan kararlı performans:

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.

Explore More Interactive Tests & Guides

Discover personalized cognitive assessments, stress evaluations, and game psychology tools on DopaBrain.

Go to Portal Hub