Pepper.SFX
All Guidance pages

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.