Dans ce tutoriel, je vais vous montrer comment lire un fichier audio dans Unity et, surtout, comment j’ai résolu un problème lié au chevauchement de la lecture audio à partir d’un Audio Source.


La version vidéo de ce tutoriel n’est actuellement pas disponible dans cette langue.


Transcription de la vidéo

Bonjour à tous ! Dans ce tutoriel, je vais vous montrer comment lire un fichier audio dans Unity et, surtout, comment j’ai résolu un problème lié au chevauchement de la lecture audio à partir d’un Audio Source. Avant de continuer, notez que la solution présentée dans la vidéo est simplement celle que j’ai adoptée pour ce problème, mais il existe probablement d’autres solutions, peut-être meilleures. Ne considérez donc pas les informations fournies ici comme l’approche définitive.

Le tutoriel a été réalisé avec Unity 2022. Plus précisément, je souhaite lire un fichier audio de pas, provenant du premier jeu Prince of Persia de Jordan Mechner, qui a été ma première expérience de jeu sur PC, lorsque le personnage se déplace dans la scène. Cela peut sembler simple, mais comme nous allons le voir, cela cache un petit défi.

Pour lire le son des pas, la première étape consiste à attacher un objet Audio Source au personnage. Dans cet objet, nous allons définir le fichier audio à lire et configurer les autres propriétés de lecture.

Un Audio Source est un composant qui doit être ajouté à un objet de la scène. Cela peut être le personnage, une porte, une balle ou même un objet invisible, utile pour lire un fichier audio lorsque le personnage entre dans une pièce spécifique ou s’approche d’un élément particulier.

Pour que l’audio soit entendu par la Main Camera, celle-ci doit posséder un composant Audio Listener actif. Dans les nouveaux projets Unity, la Main Camera contient généralement un Audio Listener actif par défaut, car il est supposé que l’on souhaite entendre les fichiers audio. Si l’Audio Listener par défaut est absent, il peut être ajouté depuis l’Inspector de l’objet Main Camera.

Dans mon cas, le fichier audio doit être associé au personnage.

Dans mon projet, il existe un objet Player qui sert de parent à la Main Camera. Le script de déplacement est associé à l’objet Player, tandis que la caméra possède un script permettant de regarder autour de soi. Par conséquent, je vais attacher un composant AudioSource à l’objet Player.

En accédant à l’onglet du composant nouvellement créé, vous verrez immédiatement le champ AudioClip, qui est initialement défini sur None.

Il existe également une case à cocher appelée Play on Awake, sélectionnée par défaut. Cette option lit le fichier audio au démarrage du jeu, ce qui peut être utile dans certains cas. Cependant, elle n’est pas nécessaire dans notre situation, je vais donc la désactiver.

Importer un clip audio dans le projet est très simple : il suffit de faire glisser le fichier audio depuis une fenêtre File Browser vers l’onglet Project ou de le sélectionner depuis votre disque via la fenêtre Assets - Import New Asset.

Unity est compatible avec différents formats audio, comme mp3, et affiche une icône de note de musique à côté de l’élément correspondant dans l’onglet Project.

Comme vous pouvez le voir, mon projet contient déjà plusieurs fichiers audio destinés à être lus à différents moments. Parmi ces fichiers, celui qui nous intéresse s’appelle PoP---walk.

Pour continuer, je sélectionne d’abord Player dans la Hierarchy.

Ensuite, je clique et je maintiens le bouton de la souris sur l’asset PoP---walk dans l’onglet Project.

Enfin, je fais glisser cet élément dans le champ AudioClip du composant AudioSource associé à Player.

Comme mentionné précédemment, le son doit être lu lorsque le personnage se déplace.

Pour cela, j’ouvre le script responsable du déplacement du personnage et j’insère le code nécessaire.

Tout d’abord, je crée une variable AudioSource et je l’initialise dans la fonction Start en l’associant au composant AudioSource de Player.

Pour cela, j’écris le code suivant :

private AudioSource playerAudioSource;

et, à l’intérieur de la fonction Start :

playerAudioSource = GetComponent();

Je dois également créer une variable AudioClip à associer au fichier audio à lire. Je vais l’appeler myAudioClip et utiliser l’attribut SerializeField afin qu’elle soit visible dans l’Inspector. Après avoir enregistré le script, l’étape suivante consistera à faire glisser l’asset PoP---Walk dans le champ myAudioClip du script dans l’Inspector.

Juste après la définition de playerAudioSource, j’écris la ligne suivante :

[SerializeField] private AudioClip myAudioClip;

Après avoir enregistré le script, je retourne dans l’éditeur Unity et je fais glisser l’asset PoP---Walk dans le champ myAudioClip du script, comme décrit précédemment.

Pour le moment, l’audio n’est pas encore lu.

Dans la fonction Update du script, il y a des instructions qui détectent les appuis sur les touches de l’utilisateur, lesquels contrôlent le déplacement du personnage.

Plus précisément, lorsque l’utilisateur déplace le personnage, la valeur de Input.GetAxis pour Horizontal et Vertical, que j’ai renommées x et y pour plus de commodité, peut être égale à -1 ou 1 selon la direction.

Dans ce cas, je pourrais écrire le code suivant :

if ((Mathf.Abs(x) == 1) || (Mathf.Abs(z) == 1))

playerAudioSource.PlayOneShot(myAudioClip);

et lancer le jeu. Cependant, ce serait une erreur majeure, car Unity lirait le fichier audio à CHAQUE FRAME DU JEU.

Le résultat ne s’améliore pas si l’on déplace simplement la fonction PlayOneShot dans une Coroutine et que l’on ajoute une instruction de délai d’une seconde, yield return new WaitForSeconds(1). Le problème reste que Update appellera la Coroutine à chaque frame, ce qui nous ramène à la même erreur.

La Coroutine n’est donc pas nécessaire. Il faut plutôt effectuer une vérification simple sur l’AudioSource : lire l’audio uniquement si l’AudioSource n’est PAS déjà en train de le lire.

Cela peut être fait dans la fonction Update en écrivant le code suivant à l’intérieur du bloc if qui vérifie les valeurs de x et y :

if (!(playerAudioSource.isPlaying))

playerAudioSource.PlayOneShot(myAudioClip);

Nous pouvons maintenant enregistrer le script, lancer le jeu et observer, ou plutôt écouter, le résultat.

Avant de conclure ce tutoriel, je voudrais partager une réflexion : le champ AudioClip du composant AudioSource peut bien sûr être modifié par script.

Cela signifie que vous pouvez utiliser cet AudioSource pour lire un son standard de pas, mais aussi remplacer le clip audio pendant le jeu par un autre si, par exemple, le personnage marche sur du gravier, sur le rivage ou sur d’autres surfaces identifiées à l’aide de Colliders.

De plus, si votre personnage peut voler, vous pouvez désactiver l’AudioSource afin qu’aucun son ne soit lu.

Voilà pour ce tutoriel, j’espère qu’il vous a été utile. À très bientôt !

Ce site a pour seul objectif de présenter certains de mes travaux, sans aucune intention promotionnelle. Veuillez noter que je ne recherche actuellement - et ne répondrai pas - à aucune demande de travaux personnalisés, de conseil ou de toute autre forme de collaboration professionnelle.


POLITIQUE GENERALE DE CONFIDENTIALITE ET D'UTILISATION DES COOKIES