Comment en finir avec les problèmes de son en utilisant l’AudioMixer


Je pense que nous ne débattrons pas du sujet : le son est très important dans un jeu vidéo. Il participe à l’immersion et peut même avoir une place très importante dans le Gameplay. Mais comment gérer des dizaines voir des centaines de sons sans s’arracher les cheveux ? Avec un AudioMixer bien sûr.

Introduction

Il est très simple de jouer un son dans Unity. Il vous faut deux choses :

  • Un AudioListener (généralement placé sur la caméra) qui va écouter ce qui se passe
  • Un AudioSource qui va produire un son

Simple comme bonjour. En allant un peu plus loin, vous pouvez modifier les paramètres de l’AudioListener ou de l’AudioSource pour affiner le résultat.

Faisons maintenant un bon en avant dans la production de votre projet. Vous avez maintenant des centaines de sons joués sur la scène. L’un d’entre eux est trop fort par rapport aux autres, vous pouvez changer son volume… Mais du coup, un autre son devient trop fort à son tour.

On commence à buter sur une problématique assez conséquente : l’harmonie sonore générale de la scène. A ce stade, vous pourriez avoir envie de vous créer un gestionnaire audio pour prendre en charge tout ça. Ou bien utiliser un AudioMixer.

Problématiques courantes

Comme expliqué plus haut, plus vous ajouterez de sons à votre projet, plus leur gestion va devenir compliquée :

  • Pour ajuster l’harmonie générale des sons pendant le développement sans y passer des heures
  • Permettre au joueur de régler le son en jeu
  • Permettre au joueur de couper les effets sonores mais pas la musique (là ça commence à devenir marrant)

Et les problématiques ne s’arrêtent pas là. Pour jouer un effet particulier sur un son ? Pour faire varier cet effet dans le temps selon les actions du joueur ?

Heureusement, vous avez à disposition un Asset au doux nom de AudioMixer pour nous accompagner.

Présentation de l’AudioMixer

Pour lire un son, vous avez besoin d’un AudioSource et d’un AudioListener. L’AudioListener va « écouter » les AudioSources à portée et Unity va restituer le son dans vos enceintes :

Schéma de flux audio sans AudioMixer

En utilisant un AudioMixer, le son généré par un AudioSource va tout d’abord passer par celui ci avant d’arriver à l’AudioListener :

Schéma de flux audio avec AudioMixer

De cette manière, le son pourra être intercepté et modifié de diverses manières que nous allons voir plus bas.

L’AudioMixer dans Unity

L’AudioMixer est un Asset comme les autres. Vous pouvez en créer un via le menu de création d’Assets :

Menu de création d'un AudioMixer

Faites un double clic sur l’AudioMixer pour ouvrir la fenêtre associée. Vous pouvez également l’ouvrir manuellement via le menu Window > AudioMixer

La fenêtre AudioMixer permet d’afficher tous les AudioMixers présents dans le projet. Ici, vous pouvez voir que le projet compte 4 mixers : celui que je viens de créer (MyMixer) ainsi que les 3 mixers du package Standard Assets.

Gestion des AudioMixer

Chaque Mixer va avoir des groupes. Chacun de ces groupes va vous permettre de chaîner des effets. Par défaut, un groupe « Master » est créé mais vous pouvez en créer d’autres et les lier les uns aux autres tout comme la hiérarchie de la scène.

Pour utiliser le système de Mixers comme expliqué plus haut, il vous faut modifier chacun de vos AudioSource pour leur dire de pointer sa sortie vers un groupe d’un Mixer. Attention, on parle bien d’un groupe et non pas du Mixer en lui même.

C’est fastidieux à faire si vous reprenez un projet existant mais le jeu en vaut la chandelle. Vous pouvez faire un drag’n’drop d’un groupe de Mixer vers le champ Output de l’AudioSource, juste en dessous du clip audio :

Inspecteur d'un AudioSource

A partir de maintenant, le son produit par vos AudioSource vont passer par votre AudioMixer via le groupe sélectionné avant d’arriver à l’AudioListener. Vous l’aurez sans doute déjà remarqué, mais vous pouvez bien évidemment utiliser plusieurs Mixers différents pour gérer différentes familles de sons.

Utilisation de l’AudioMixer

Jusqu’à présent nous avons vu beaucoup de théorie, alors voyons maintenant un peu de pratique. La hiérarchisation des groupes pour permets de gérer les flux sonores et les effets associés en cascade, un peu comme pour la hiérarchie des GameObjects sur une scène. Prenons cette hiérarchie de groupes :

Affichage des groupes d'un AudioMixer

Ici, nous avons un groupe parent Master qui a deux groupes enfants SFX et Music. Schématiquement, si on prend deux AudioSources pointant vers les groupes SFX et Music, voilà ce que ça donne :

Flux sonore avec différents groupes dans un même AudioMixer

 

Si vous baissez le volume sonore du groupe Master, cela va réduire le volume sonore des sons utilisant le groupe SFX mais également le volume de ceux utilisant le groupe Music.

Voilà, sans vous en rendre compte, vous venez de mettre en place un système de gestion du volume sonore dans votre projet. Sur chaque groupe, vous pouvez ajouter un effet pour modifier le flux audio selon vos besoins via le bouton Add en bas d’un groupe :

Table de mixage d'un groupe

Je vous laisse explorer les possibilités offertes par les différents effets.

Piloter l’AudioMixer

Vous vous en doutez, les AudioMixers peuvent être pilotés par du code. Pour commencer il vous faut « exposer » les valeurs que vous souhaitez modifier dans un script. Pour ce faire, sélectionnez un groupe et regardez l’inspecteur. Faites un clic droit sur la propriété que vous voulez rendre accessible et cliquez sur « Expose … » :

Exposition d'un paramètre dans un AudioMixer

Pour vérifier qu’une variable est exposée ou non, vous avez une petite flèche indicative :

Affichage d'un paramètre exposé

Pour avoir la liste des paramètres exposés de votre Mixer, vous pouvez ouvrir le menu en haut à droite de la fenêtre Audio Mixer :

Menu de gestion des paramètres exposés

Vous avez la possibilité de les renommer avec un clic droit ou de supprimer leur exposition dans les scripts.

Votre variable est accessible depuis un script. Comment faire maintenant ? Créez un nouveau script et ajoutez lui le Mixer en paramètre comme ceci :

public class VolumeManager : MonoBehaviour
{
    [SerializeField]
    private AudioMixer _mainMixer;

    private void Start()
    {
        _mainMixer.SetFloat("MyExposedParam", 1f);
    }
}

Voilà, votre script va au démarrage forcer le volume sonore de ce mixer à 1.

Pour aller plus loin

Vous avez vu que l’on peut créer plusieurs AudioMixers. Et bien le flux de sortie d’un AudioMixer peut être redigiré vers le groupe d’un autre AudioMixer afin de créer une chaîne plus complexe.

Pour lier la sortie d’un Mixer vers un groupe d’un autre Mixer, depuis la fenêtre AudioMixer, faites un drag’n’drop d’un Mixers vers celui de destination. Une fenêtre s’ouvre alors pour vous proposer de choisir le groupe de sortie :

Hiérarchisation d'un AudioMixer

 

Dès lors, la sortie du Mixer « PropellerPlane » va arriver dans le groupe SFX du Mixer MyMixer. On obtient le flux suivant :

Flux sonore avec utilisation de plusieurs AudioMixers

Vous pouvez également jeter un oeil du côté de la documentation des groupes ici : https://docs.unity3d.com/ScriptReference/Audio.AudioMixerGroup.html

De même, vous pourriez avoir besoin de créer des menus personnalisés pour gérer vos différents éléments sonore : https://www.esprit-unity.fr/2017/05/27/creer-menus-personnalises-unity-3d/

Conclusion

Avec ce que vous avez vu dans ce tutoriel, vous devriez pouvoir gérer la partie sonore de vos projets plus simplement. Cela pourra même vous permettre d’expérimenter des choses plus audacieuses !

Cet article vous a appris quelque chose ? Partagez-le sans attendre avec les liens ci dessous !


2 commentaires

  1. Je profite de cet article pour te remercier de publier autant d’astuces et tutos. C’est très bien fait, captures d’écrans à l’appui, merci de donner de ton temps de la sorte !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *