Utiliser le composant AudioSource

Nous allons voir comment fonctionne Unity au niveau de la gestion du son ; à commencer par un setup de scène simpliste, en passant par l'utilisation des composants liés à l'audio par du script C#.

 

 

Commençons par le setup de notre scène de tests :

  • Nouveau projet (toujours, pour les prototypes !)
  • Import des packages dont on va avoir besoin :
    • Pour pouvoir expérimenter les sons dans l'espace 3D, le Character Controller
    • Et histoire de mettre un peu de couleur, le Terrain Assets
  • Edition d'une scène basique :
    • Créer un Terrain de 100 sur 100, lui mettre quelques textures...
    • Placer le First Person Controller ainsi qu'une Directional light
  • Observez l'arborescence du First Person Controller : Il est équipé d'une Main Camera ("les yeux" du joueur), et celle-ci est équipée d'un composant Audio Listener ("les oreilles" du joueur). En effet, c'est ce composant qui recevra les flux sonores de votre jeu et qui les retranscrira sur le système d'écoute du joueur (enceintes, écouteurs, etc...)

L'idée

Ce que l'on va mettre en place :

  • Une musique, ou un son d'arrière plan, qui tourne en boucle et qui peut être changée si on accède à une zone différente.
    • La particularité de ce son sera que où que l'on soit dans la scène, le joueur l'entendra au même volume dans les écouteurs de droite et de gauche.
  • Un objet quelconque dans la scène qui déclenchera un son 3D différent à chaque fois que le joueur s'en approchera.
  • Et pourquoi pas un autre objet diffusant un son 3D en boucle...

Les sons

Pour les sons que l'on va utiliser, nous allons nous servir de l'asset store :

Une fois les sons importés, n'oubliez pas de bien organiser vos dossiers...

Sélectionnez 2 sons d'ambiance, et rangez-les dans un dossier bien spécifique.

De même avec les effets spéciaux : prenez-en au moins 2 ou 3 pour l'objet qui déclenchera à l'approche du joueur.

Et enfin, un dernier effet pour l'objet où le son tournera en boucle.

Voici comment se présente le dossier du projet
Voici comment se présente le dossier du projet

Un cylindre diffusant un son en boucle

Commençons par le plus simple : Un objet diffusant un son en continue dans la scène.

  1. Pour le test, plaçons un cylindre dans la scène.
  2. Y ajouter un composant Audio Source.
    • Laisser coché la case Play On Awake : le son déclenchera au lancement du jeu (dès l'apparition du gameobject en fait).
    • Et cocher la case Loop pour que le son qu'on va y placer joue en boucle.
  3. Sélectionnez enfin le son que vous avez choisit et faites le glisser dans l'espace Audio Clip.
    • Lorsque vous sélectionnez votre clip, observez bien ceci : l'option 3D Sound est cochée ; ce qui signifie que le son sera diffusé avec des effets spatialisation liés au monde 3D (plus le joueur s'en rapprochera, plus le volume augmentera).
Setup complet du cylindre
Setup complet du cylindre

Il ne vous reste plus qu'à paramétrer les distances sonores. Cela se règle dans le viewport. A la fin, vous devez obtenir un paramétrage de ce type :

Testez le jeu : plus vous vous approchez du cylindre, plus le son est fort, et celui-ci tourne en boucle.

Une sphère émettant un son différent à chaque approche du joueur

Il faut d'abord identifier les éléments entrant en jeu :

  • "Une sphère émettant un son..."
    • Donc, tout d'abord, une sphère
    • Nécessité de l'équiper d'un AudioSource (évidemment ^^ )
  • "... à chaque approche..."
    • Besoin de plusieurs sons
    • Besoin d'un déclencheur
      • "... du joueur" : ce déclencheur reconnaîtra que c'est le joueur et rien d'autre qui le déclenche...

Edition de la scène :

  • Placer une sphère 3D dans dans votre scène
  • Équipez-la d'un AudioSource, paramétrez les distances de diffusion du son de cet AudioSource et décochez PlayOnAwake.
  • Nous allons avoir besoin d'un déclencheur :
    • Ajouter un SphereCollider, paramétrez-le en Trigger et rendez-le un peu plus grand que la sphère elle-même.
  • Le reste va se gérer par script...

Le script

  • Créez votre C# et placez-le sur la sphère.
  • Sauvegardez bien le tout (CTRL + S)
  • Le reste sera expliqué dans le script...

Première lignes de code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
using UnityEngine;
using System.Collections;

public class SphereBruillante : MonoBehaviour
{
        //J'ai prévu de d'utiliser 3 sons, pour cette sphère.
        //La 1ère chose est donc de déclarer 3 AudioClip que j'assignerai via l'inspecteur

        public AudioClip son1;
        public AudioClip son2;
        public AudioClip son3;


        //Lorsque le joueur s'approchera de la sphère, quelque chose se passera
        void OnTriggerEnter ( Collider other )
        {
                //Tout d'abord, tester voir si notre collider fonctionne bien
                Debug.Log ( other.name );
        } 
}

Documentations : AudioClip, OnTriggerEnter

A partir de là, on va essayer de repérer le Player. Donc, il s'agit de tagger le First Person Controller "Player".

Testons désormais le tag, voir si l'on repère bien notre Player.

1
2
3
4
5
6
//Lorsque le joueur s'approchera de la sphère, quelque chose se passera
void OnTriggerEnter ( Collider other )
{
        if ( other.tag == "Player" )
                Debug.Log ( "OK !" );
} 

Lorsque cela fonctionne, on peut commencer à faire fonctionner le son.

Tout d'abord, il nous faut récupérer le composant AudioSource afin de lui envoyer des sons :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
//Création d'une variable afin de garder une référence au composant AudioSource
private AudioSource _audioSource;


//Au démarrage du jeu
void Start ()
{
        //On récupère le composant AudioSource du gameObject et on l'assigne à la variable prévue à cet effet
        _audioSource = this.GetComponent<AudioSource> ();
}

Documentations : AudioSource

Maintenant qu'on a récupéré notre AudioSource, on va pouvoir l'utiliser pour y envoyer du son.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
//Lorsque le joueur s'approchera de la sphère, quelque chose se passera
void OnTriggerEnter ( Collider other )
{
        if ( other.tag == "Player" )
        {
                //Afin de voir si le son fonctionne, on va essayer ces deux lignes de code :
                _audioSource.clip = son1;       //Ceci permet d'assigner le son1 comme AudioClip par défaut (ce que l'on a fait tout à l'heure via l'inspecteur
                _audioSource.Play ();           //Et cela lance simplement la lecture du clip par défaut
        }
}

Maintenant, pour qu'un son différent soit joué à chaque approche du joueur, il nous faut créer une fonction. En voici une qui fonctionne :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Lorsque le joueur s'approchera de la sphère, quelque chose se passera
void OnTriggerEnter ( Collider other )
{
        if ( other.tag == "Player" )
                PlayRamdomSounds ();
}

private void PlayRamdomSounds ()
{
        float randomFloat = Random.Range ( 1, 4 );         //Créer un nombre aléatoire à virgule flottante compris entre 1 (compris) et 4 (non compris)
        int nbr = Mathf.CeilToInt ( randomFloat );               //Arrondir à l'entier inférieur

        //On vérifie ensuite la valeur obtenue au-dessus et on assigne à l'AudioSource le clip correspondant
        if ( nbr == 1 )
                _audioSource.clip = son1;

        else if ( nbr == 2 )
                _audioSource.clip = son2;

        else if ( nbr == 3 )
                _audioSource.clip = son3;

        //Et enfin on joue le son
        _audioSource.Play ();
}

Le script dans son ensemble :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using UnityEngine;
using System.Collections;

public class SphereBruillante : MonoBehaviour
{
        //J'ai prévu de d'utiliser 3 sons, pour cette sphère.
        //La 1ère chose est donc de déclarer 3 AudioClip que j'assignerai via l'inspecteur

        public AudioClip son1;
        public AudioClip son2;
        public AudioClip son3;

        //Création d'une variable afin de garder une référence au composant AudioSource
        private AudioSource _audioSource;


        //Au démarrage du jeu
        void Start ()
        {
                //On récupère le composant AudioSource du gameObject et on l'assigne à la variable prévue à cet effet
                _audioSource = this.GetComponent<AudioSource> ();
        }


        //Lorsque le joueur s'approchera de la sphère, quelque chose se passera
        void OnTriggerEnter ( Collider other )
        {
                if ( other.tag == "Player" )
                        PlayRamdomSounds ();
        }

        private void PlayRamdomSounds ()
        {
                float randomFloat = Random.Range ( 1, 4 );         //Créer un nombre aléatoire à virgule flottante compris entre 1 (compris) et 4 (non compris)
                int nbr = Mathf.CeilToInt ( randomFloat );               //Arrondir à l'entier inférieur

                //On vérifie ensuite la valeur obtenue au-dessus et on assigne à l'AudioSource le clip correspondant
                if ( nbr == 1 )
                        _audioSource.clip = son1;

                else if ( nbr == 2 )
                        _audioSource.clip = son2;

                else if ( nbr == 3 )
                        _audioSource.clip = son3;

                //Et enfin on joue le son
                _audioSource.Play ();
        }
}

Son d'ambiance selon les zones traversées

Un son d'ambiance dont le niveau de volume ne variera pas selon quelconque déplacement du joueur, mais qui changera selon les zones auxquelles il accédera.

 

Idée de gestion du son : un script sur le First Person Controller repérera le changement de zone grâce à l’événement OnTriggerEnter et changera le son d'ambiance.

 

Dans notre cas, nous allons utiliser 2 sons d'ambiance ; nous allons donc commencer par déclarer les variables adéquates.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
using UnityEngine;
using System.Collections;

public class SonsAmbiance : MonoBehaviour
{
        //Les sons seront à assigner via l'inspecteur
        public AudioClip ambiance1;
        public AudioClip ambiance2;


        // Use this for initialization
        void Start () {
        
        }
        
        // Update is called once per frame
        void Update () {
        
        }
}

Avant d'assigner les sons d'ambiance via l'inspecteur, il faut tout d'abord les préparer :

  1. Choisir les deux sons à utiliser et les mettre de côté
  2. Les sélectionner un à un afin de les configurer comme ceci :
  • C'est en décochant la case 3D Sound que le son sera configuré pour être diffusé uniquement en stéréo. Ce ne sera donc plus un son 3D, évoluant dans l'espace 3D de Unity, mais un simple son à volume fixe.
  • Passer le son en mode Compressed permet de gagner de la place dans vos projets.

A partir de là, les sons sont prêts à l'emploi. Il ne reste plus qu'à les assigner à notre script que l'on aura au préalable ajouté au FirstPersonController. Il nous faut aussi ajouter le composant AudioSource afin de pouvoir diffuser du son.

Au niveau du setup de la scène, j'ai choisit de schématiser une salle. Lorsque le joueur pénétrera dans le collider, le son changera. Lorsqu'il quittera la zone, le son de l'extérieur reviendra. J'ai au préalable taggé le gameobject accueillant le collider "ChangementSon".

Voici le premier test à faire avec le script afin de s'assurer que le setup fonctionne bien :

1
2
3
4
5
6
//Lorsque quelque chose entre en contact avec le collider (du personnage joueur)
void OnTriggerEnter ( Collider collider )
{
        //Afficher ce que l'on trouve
        Debug.Log ( collider.tag );
}

Votre console doit afficher le bon tag : ici, "ChangementSon".


Maintenant que notre setup fonctionne, on va pouvoir mettre en place le son à l'aide du script.

  1. Un son d'ambiance se lance automatique lorsque le joueur arrive dans la zone (au chargement du jeu).
  2. Un son différent sera déclenché lorsque le joueur entrera en collision avec le collider de la zone intérieur.
  3. Le 1er son d'ambiance sera ré-enclenché lorsque le joueur quittera l'intérieur.

Voici un script qui fonctionne :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using UnityEngine;
using System.Collections;

public class SonsAmbiance : MonoBehaviour
{
        //Les sons seront à assigner via l'inspecteur
        public AudioClip ambiance1;
        public AudioClip ambiance2;

        //Référence au composant AudioSource du gameObject
        private AudioSource _audioSource;


        // Use this for initialization
        void Start ()
        {
                //Récupération de l'AudioSource
                _audioSource = this.GetComponent<AudioSource> ();

                _audioSource.clip = ambiance1;  //Assignation du son d'ambiance 1 à l'audiosource
                _audioSource.Play ();                   //Lecture du son
        }

        //Lorsque quelque chose entre en contact avec le collider (du personnage joueur)
        void OnTriggerEnter ( Collider collider )
        {
                if ( collider.tag == "ChangementSon" )
                {
                        _audioSource.clip = ambiance2;
                        _audioSource.Play ();
                }
        }

        //Lorsque quelque chose quitte le contact avec le collider
        void OnTriggerExit ( Collider collider )
        {
                if ( collider.tag == "ChangementSon" )
                {
                        _audioSource.clip = ambiance1;
                        _audioSource.Play ();
                }
        }
}

Écrire commentaire

Commentaires: 0