Animer les objets en fonction du son

Contribution : Mélodie Souty Date : 24/05/2016

Grâce à un script, on peut animer les objets, les faire se déplacer ou changer leur taille en fonction du son.

Créer le préfab à animer

1. J'ai crée un cube que j'ai glissé dans mes assets.
2. Je donne un tag à mon cube (de manière à pouvoir le désigner dans mon script)

Sélectionner l'objet

Dans l'inspector > Tag > Add Tag > Bouton +

Retourner dans l'inspector de l'objet > Tag > Sélectionner le tag crée

Dans ma scène je vais disposer 10 cubes, un peu n'importe où.

Crée le script C#

//Indique qu'on utilise le système Unity.
using UnityEngine;
using System.Collections;
//Exige la présence d'un composant Audio Source. (si il n'est pas crée, il se crée tout seul)
[RequireComponent(typeof(AudioSource))]
//Ouverture de la classe "spectre" (la classe DOIT porter le même nom que le script)
public class spectre : MonoBehaviour {
//Déclaration des variables.
//Déclaration d'une variable publique qui sera un Game Object et qu'on appellera prefab
public GameObject prefab;
//Déclaration d'une variable publique qui sera un nombre entier, et qui pour l'instant est égale à 11
public int nombreObjet = 11;
//Déclaration d'une liste publique de Game Object, qu'on appellera Cubes.
public GameObject[] Cubes;
//On appeler le Composant Audio Source audio
AudioSource audio;
//Déclaration d'un liste de 256 valeurs qu'on appelle Spectrum
float[] spectrum = new float[256];
void Start () {
//Aller chercher le composant AudioSource
audio = GetComponent<AudioSource>();
//Aller chercher le GameObject avec le tag "Cube"
Cubes = GameObject.FindGameObjectsWithTag ("Cube");
}
void Update () { //Se rafraichis régulièrement comme le void draw() dans Processing
//Permet d'obtenir le spectre des fréquences de la source audio et de ranger les valeurs dans la liste spectrum
float[] spectrum = audio.GetSpectrumData(1024, 0, FFTWindow.Hamming);
//Boucle for :
Pour la valeur i, initialement égale à 0, lorsqu'elle est inférieur au nombre d'objet on l'incrémente
for (int i = 0; i < nombreObjet; i++) {
//On crée un nouveau Vecteur 3 dimensions, qu'on appelle previousScale, qui représente la taille de tout les cubes de la liste Cubes.
Vector3 previousScale = Cubes[i].transform.localScale;
//On change cette taille uniquement sur l'axe y.
//La fonction Mathf.Lerp doit être remplie avec la valeur maximale, la valeur minimal et la vitesse à laquelle on varie entre les deux. La valeur maximal correspond à la taille de notre cube, le maximum est une valeur de la liste spectre, multipliée par 1000 pour lui donner plus d'amplitude, et le temps est multiplié par 20. La fonction Time.deltaTime est valeur qui permet à tout les ordinateurs quelque soit leur puissance d'exécution de le lire à la même vitesse. Ici visuellement cela lisse un peu plus le changement de taille de notre objet, il va être plus lent (il va paraître un peu moins brutal, le changement d'une taille à l'autre va être plus progressif)
previousScale.y = Mathf.Lerp (previousScale.y, spectrum[i] * 1000, Time.deltaTime * 20);
//Ensuite on rechange la taille initiale du l'objet en fonction du changement.
Cubes[i].transform.localScale = previousScale;
}
}
}

Appliquer le script

Enfin, il suffit de faire glisser le script dans l'objet qui contient la source audio en en fonction de laquelle on veux faire bouger l'objet. Ici j'ai mis mon son dans ma caméra, j'applique le script dans ma caméra.
On retrouve dans l'inspector le détail des variables du script. Dans la variable “prefab” on glisse notre cube des assets à la case en face de préfab.
Dans “Nombre Objet” on peut change la valeur, si on rajoute des objets dans la scène. Ensuite dans “Cubes”>“Size”, on re-note le nombre d'objet qui est présent dans la scène, car il faut indiquer la taille de la liste Cubes. Ici, il apparait une liste d'onze éléments. Une fois que l'on appuis sur Play, pour jouer au jeu, la liste se rempli automatiquement de tout les GameObject cube avec un tag “cube” qui sont présent dans la scène. Si on ajoute des préfab dans la scène et qu'on ne change pas la taille de la liste ni la variable NombreObjet, les objets ne s'animeront pas.
Ensuite, on peut changer dans Math.lerpf on peut augmenter la valeur avec laquelle on multiplie la liste spectrum[i], pour diminuer le augmenter le changement de taille des cubes.

Sommaire