[Résolu]Lire un tableau d'AudioClip

Questions à propos de la partie audio, y compris les problèmes de script s'y rapportant.
descole974
Messages : 9
Inscription : 10 Mai 2015 16:50

[Résolu]Lire un tableau d'AudioClip

Message par descole974 » 25 Mai 2015 14:25

Bonjour, mon problème est simple. j'ai un tableau de 10 AudioClip. Je voudrais le lire depuis le premier(indice 0 donc) jusqu'au dernier(indice 9) les uns après les autres. Voici mon code :

Code : Tout sélectionner

public AudioClip[] sons;

public void LireTout () {
		for(int i=0; i<10; i++)
		{
			audio.clip = sons[i];
			audio.Play();
		}
Le code ne contient pas d'erreurs mais il ne lit que le dernier(indice 9). Pouvez-vous m'aider?
Dernière édition par descole974 le 28 Mai 2015 16:04, édité 1 fois.

Avatar de l’utilisateur
Orkad
Messages : 24
Inscription : 03 Avr 2015 19:31

Re: Lire un tableau d'AudioClip

Message par Orkad » 25 Mai 2015 15:00

Le code ne contient pas d’erreur certes, mais il ne correspond pas à l'explication que tu nous donne (les uns après les autres). Et je ne vois pas dans ton code une condition sur l'audioClip pour voir s'il est terminé ou non, ton "for" va juste tous les balancer en même temps et comme il ne peux en jouer qu'un seul à la fois il remplace le précédent par le suivant voilà pourquoi c'est toujours le dernier qui est joué. Je le répète encore, mais le for n'est pas en adéquation avec Unity, il exécute toute la boucle en moins d'une frame qu'elle fasse 10 itération ou 100000, passe par l'update ou par une coroutine. Dans tous les cas tu devrais contrôler si le son est fini de jouer avant de lancer le suivant. Bonne chance :)

descole974
Messages : 9
Inscription : 10 Mai 2015 16:50

Re: Lire un tableau d'AudioClip

Message par descole974 » 25 Mai 2015 15:37

Orkad> Voici un nouveau code:

Code : Tout sélectionner

public AudioClip[] sons;

public void LireTout () {

		while(sons.Length)
		{
			int i = 0;
			audio.clip = sons[i];
			audio.Play(); // Lire le sons d'indice i
			if(sons[i] == sons[i].length)
				i++; // Si le sons est fini, jouer la suivante
		}

	}
Mais il me dit qu'il ne peut pas convertir un 'int' en 'bool'. A tu un moyen d'y arriver?

Avatar de l’utilisateur
Orkad
Messages : 24
Inscription : 03 Avr 2015 19:31

Re: Lire un tableau d'AudioClip

Message par Orkad » 25 Mai 2015 15:59

Je pense que tu devrais dans un premier temps regarder quelques tutoriel sur le C#, j'te demande pas de devenir un pro bien sur mais au moins de comprendre les type de donnée, le booléen est le type unique utilisé dans toutes les conditions. Oui je saurais comment faire mais ton code ne marcherais pas mieux car un while au même titre qu'un for est une boucle le problème sera le même, il faut que tu passe par l'update ou que tu convertisse ta fonction en coroutine. ça te permettra de pouvoir faire des test a l'échelle du temps. Dans ton cas la fonction, je suppose, est appelée une seule fois, tout va être traité instantanément il faut bien que tu comprenne ça.

Je vois que tu as déja bien compris le principe des boucles mais par contre il va faloir que tu revois les conditions.

Quand je vois ça j'ai envie de pleurer :

Code : Tout sélectionner

if(sons[i] == sons[i].length)

tu compare juste un AudioClip avec un float ça n'a aucun sens .Il faut que tu fasse attention au length qui est une variable à la fois de la classe AudioClip qui te retourne en float la durée de l'audio clip mais aussi de la classe Array qui te retourne la taille de ton tableau en int (AudioClip[] correspond à un Array d'AudioClip).

Je ne compte pas te mâcher le boulot, car je pense que ce serait plus enrichissant pour toi que tu y arrive de toi même, mais je peux bien sur t'aiguiller. Déjà commence a choisir comment réaliser le controle sur le temps (Update ou coroutine) ensuite pose toi les bonnes questions sur les conditions et surtout régarde comment fonctionne une condition avant tout.

Je te donne le principe de base avec l'update :

Code : Tout sélectionner

public class MaClasse:MonoBehaviour{
	public AudioClip[] sons;
	public int i = 0;

	void Update(){
		if(//Si aucun son actif et qu'il reste encore des sons a jouer){
			//Joue ton son en fonction de i (sons[i])
			i++;
		}
	}
}
En gros c'est ça le principe, désolé d'avoir été un peu dur mais tu dois absolument comprendre comment le code fonctionne avant de coder sinon tu risque de facilement abandonner. Bonne chance a toi

descole974
Messages : 9
Inscription : 10 Mai 2015 16:50

Re: Lire un tableau d'AudioClip

Message par descole974 » 26 Mai 2015 19:05

Bonjour. Voilà ce que j'ai pu trouver(à mon niveau). Il est beaucoup plus long que dans le message précédent.

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
[ RequireComponent (typeof ( AudioSource ))]

public class LireTout : MonoBehaviour {
	
	AudioSource audio;
	public AudioClip[] sons;
	int i = 0;

	void Start (){
		audio = GetComponent<AudioSource>();
	}


	void Update () {
		audio.clip = sons[i];
		if ((!audio.isPlaying) && (i < sons.Length)) {
			audio.Play();
			i++;
		}
	}

}
Le problème est qu'il lit le premier son mais passe directement au dernier. De plus,il y a un message d'erreur
"IndexOutOfRangeException: Array index is out of range.
LireTout.Update () (at Assets/scripts/LireTout.cs:17)"
Si vous savez quel est l'erreur.

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: Lire un tableau d'AudioClip

Message par artemisart » 26 Mai 2015 22:37

Code : Tout sélectionner

if (!audio.isPlaying && ++i < sons.Length) {
	audio.clip = sons[i];
	audio.Play();
}
avec i = -1 au tout début.

descole974
Messages : 9
Inscription : 10 Mai 2015 16:50

Re: Lire un tableau d'AudioClip

Message par descole974 » 27 Mai 2015 16:05

artemisart> Merci beaucoup pour le code, il marche bien. Mais je voudrais savoir où était mon erreur si vous le savez.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Lire un tableau d'AudioClip

Message par boubouk50 » 27 Mai 2015 17:01

Il fallait mettre audio.clip = sons; dans la condition pour éviter que l'audioClip soit changé à la frame suivante, puisque i s'était incrémenté.
Il faut croire que le fait de changer d'audioClip coupe celui-ci donc tu entrais une nouvelle fois dans ta condition, ainsi de suite jusqu'à ce qu'il n'y ait plus de Clip à jouer. (Out Of Range)
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

descole974
Messages : 9
Inscription : 10 Mai 2015 16:50

Re: [Résolu]Lire un tableau d'AudioClip

Message par descole974 » 28 Mai 2015 16:05

Merci pour l'information boubouk50 :D

Répondre

Revenir vers « Audio, musique et sons »