Guidance / Cookbook
Multi-Position Audio
Recipe: Nightclub Speaker Setup
📋 What: 8 speakers playing synchronized music
🎯 Use Case: Nightclubs, concerts, speaker arrays
Asset Setup
1. Create Container:
- Routing Container: “Music_Nightclub_RC”
- Clip: Club music loop
- Loop: ✓
- Volume: 1.0
- Is3D: ✓
- Min Distance: 3
- Max Distance: 40
2. Create Event:
- Event: “Music_Start_Nightclub”
- Priority: Medium
- Max Instances: 1
- Actions: Play Music_Nightclub_RC → Music_Bus
There’s no multi-position setting on the event. Posting it with PostMultiPosition is what plays it from every speaker.
Scene Setup
1. Create Parent:
- GameObject: “NightclubSpeakers”
- Add Component: AudioMultiPositionEmitterParent
- Inspector:
- Max Emitters: 8
- Auto Find Children: ✓
- Auto Update Children: ✓
2. Create Speakers (Manual or Auto):
Auto (Recommended):
- Select NightclubSpeakers
- Inspector → Context Menu → “Create 8 Child Emitters (Circle Pattern)”
- Adjust radius and positions as needed
Manual:
- Create 8 child GameObjects
- Position in circle around dance floor
- Add AudioMultiPositionEmitterChild to each
- Configure:
- Is Active: ✓
- Volume Multiplier: 1.0
- (Optional) Use Directionality ✓ and Cone Angle 90, then rotate to face inward: this only draws a cone in the Scene view to help you aim the speakers. It doesn’t change what you hear.
Code
using UnityEngine;
using AudioSystem;
public class NightclubAudio : MonoBehaviour
{
[SerializeField] private AudioEvent musicEvent;
[SerializeField] private bool playOnStart = true;
private AudioMultiHandle musicHandle;
private AudioMultiPositionEmitterParent emitterParent;
void Start()
{
emitterParent = GetComponent<AudioMultiPositionEmitterParent>();
if (playOnStart)
{
StartMusic();
}
}
void StartMusic()
{
if (musicEvent != null && emitterParent != null)
{
musicHandle = musicEvent.PostMultiPosition(emitterParent);
Debug.Log($"Playing music on {musicHandle.VoiceCount} speakers");
}
}
public void StopMusic(float fadeTime = 2f)
{
if (musicHandle != null)
{
musicHandle.Stop(fadeTime);
musicHandle = null;
}
}
// Optional: Control individual speakers
public void SetSpeakerVolume(int index, float volume)
{
var emitters = emitterParent.AllEmitters;
if (index >= 0 && index < emitters.Count)
{
emitters[index].VolumeMultiplier = volume;
}
}
public void ToggleSpeaker(int index, bool active)
{
var emitters = emitterParent.AllEmitters;
if (index >= 0 && index < emitters.Count)
{
emitters[index].IsActive = active;
}
}
void OnDestroy()
{
StopMusic(1f);
}
}
✅ Result: 8 speakers playing perfectly synchronized music!
From the Pepper.SFX 3.1 guides (USER_GUIDE.md). Something wrong or unclear? Tell me.