-
Notifications
You must be signed in to change notification settings - Fork 8
Tutorial #3 Setting up world audio
This tutorial walks through adding managed AudioSources to your scene using the WorldAudio system. WorldAudio provides importance-based culling, reverb, and privacy channel gating for scene audio (music, ambient, sound effects).
You will learn how to:
- Add the WorldAudioController to your scene
- Create a managed AudioSource with OccludedEmitter
- Configure spatial audio for VRChat
- Test the setup
- Installation complete
- TLP_Essentials prefab in your scene
- TLP_PlayerAudioController prefab in your scene
- Basic Unity knowledge
-
Drag the TLP_WorldAudioController prefab into your scene:
- Path:
Packages/tlp.udonvoiceutils/Runtime/Prefabs/Core/TLP_WorldAudioController.prefab - This is the core controller that drives the emitter update loop
- Path:
-
Select the
TLP_WorldAudioControllerin hierarchy -
Verify the WorldAudioController component is present in the Inspector
Note: Only one WorldAudioController is allowed per scene.
- Create a new empty GameObject (name it e.g.
AmbientMusic) - Add an AudioSource component
- Assign your audio clip to the AudioSource
- Configure basic AudioSource settings:
- Spatialize: ✅ enabled (required for VRChat 3D audio)
- Loop: ✅ enabled (for ambient/music)
- Play On Awake: ✅ enabled (starts automatically)
- Max Distance: set based on your needs (e.g. 50)
-
Add an OccludedEmitter component to the same GameObject
-
The following components are added automatically:
-
ReverbController— manages reverb and lowpass filter -
AudioSourceStateController— play/pause/cull state machine -
AudioLowPassFilter— distance-based muffling -
AudioReverbFilter— reverb effect
-
-
Configure OccludedEmitter settings:
-
Disable GameObject When Culled: ✅ enabled (saves CPU when culled)
⚠️ Set to false for Unity VideoPlayer sources — disabling breaks audio filters
-
Privacy Channel Id:
-1(no privacy, audible to all)
-
Disable GameObject When Culled: ✅ enabled (saves CPU when culled)
VRChat requires the VRCSpatialAudioSource component for proper 3D spatialization:
- Add VRCSpatialAudioSource component to the same GameObject
- Configure settings:
- Enable Spatialization: ✅ enabled
-
Gain:
0(default, no volume boost) -
Far:
40(distance where audio becomes inaudible) -
Near:
5(distance where audio is at full volume) -
Volumetric Radius:
5(range where audio is not spatialized)
AmbientMusic
├─ AudioSource (Spatialize: true, Loop: true)
├─ AudioLowPassFilter
├─ AudioReverbFilter
├─ OccludedEmitter
├─ ReverbController
└─ VRCSpatialAudioSource
Select the TLP_WorldAudioController and adjust if needed:
| Field | Default | Description |
|---|---|---|
| Importance Updates Per Frame | 1 |
Emitters to recalculate importance for per frame. Higher = more responsive, more CPU |
| Updates Per Frame | 3 |
Emitters to update per frame. Higher = more responsive, more CPU |
| Max Active Sources | 32 |
Max concurrent active emitters. Beyond this, lowest-importance emitters are culled |
- Enable ClientSim
- Click Play
- Walk toward the AudioSource — audio should be clear and loud
- Walk away — audio should fade with distance
- Walk beyond Max Distance — audio should be inaudible
The WorldAudio system manages your AudioSource through the emitter lifecycle:
- Startup — OccludedEmitter registers with the EmitterRegistry
- Importance scoring — each frame, WorldAudioController recalculates importance based on AudioSource priority and effective volume (which depends on distance and rolloff mode)
- Culling — when beyond MaxActiveSources, lowest-importance emitters are suspended
- Reverb/lowpass — distance-based audio effects applied automatically
- Reactivation — when a culled emitter becomes important again, it resumes seamlessly
See WorldAudio-Subsystem for full details.
Repeat steps 2-4 for each AudioSource you want managed:
- Ambient music
- Sound effects
- Environmental audio
- Video player audio (set
Disable GameObject When Culledto false)
- WorldAudio-Subsystem — how the system works
- WorldAudio-Limitations — AVPro incompatibility, direct control restrictions
- OccludedEmitter — per-emitter configuration
- WorldAudioController — controller settings
- How to Set Up Reverb — emitter reverb configuration
- Troubleshooting — common WorldAudio issues
- Architecture
- Occlusion
- Voice Directionality
- Height Scaling
- Audio Processing Pipeline
- Private Voice Channels
- WorldAudio Subsystem
- WorldAudio Limitations
- Set Up Occlusion
- Set Up Voice Channels
- Set Up Reverb
- Set Up Height Scaling
- Set Up Voice Directionality
- Set Up Microphone
- Set Up WorldAudio Emitters
- Enable Debug Mode
- Tutorial #1: Custom Voice Override Zone
- Tutorial #2: Private Voice Channels
- Tutorial #3: Setting Up World Audio
- PlayerAudioController
- PlayerAudioOverride
- PlayerAudioOverrideList
- PlayerAudioView
- PlayerAudioConfigurationModel
- SyncedPlayerAudioConfigurationModel
- VoiceUtils
- IgnoredPlayers
- AudioObstacle
- DefaultPlayerOcclusion
- NullPlayerOcclusion
- PlayerOcclusionStrategy
- Privacy Channel Reference
- AdjustableGain
- DynamicPrivacy
- PickupMicrophone — MVC microphone system with MicModel/MicController/MicView
- VoiceOverrideTriggerZone
- VoiceOverrideRoom