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 :
Ce que l'on va mettre en place :
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.
Commençons par le plus simple : Un objet diffusant un son en continue dans la scène.
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.
Il faut d'abord identifier les éléments entrant en jeu :
Edition de la scène :
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 (); } } |
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 :
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.
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 (); } } } |
Ce site a été conçu avec Jimdo. Inscrivez-vous gratuitement sur https://fr.jimdo.com
Écrire commentaire