[RESOLU] Choix de musique

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
marcQC
Messages : 121
Inscription : 30 Nov 2013 18:14

[RESOLU] Choix de musique

Message par marcQC » 31 Oct 2015 05:42

Bonjour

J'ai un soucis avec le code suivant, il ne joue pas les bonnes musiques (Musique 1 joue a la place de musique 2 ou aucune musique), les musiques ne se coupent pas.

En faisant un Debug.Log, je vois pourtant bien les valeur des Toggles changer de true à false;

Le script est sur la caméra qui a 3 audiosources.

Image

Image

( J'ai essayé de le faire sur le empty Togglegroup = même soucis)

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class AudioChoice : MonoBehaviour {

	public AudioSource Music1;
	public AudioSource Music2;
	public AudioSource Music3;

	public  GameObject MusicToggle1;
	public  GameObject MusicToggle2;
	public  GameObject MusicToggle3;



	// Use this for initialization
	void Start () 
	{
		AudioSource[] audios = GetComponents<AudioSource>();
		Music1 = audios[0];
		Music2 = audios[1];
		Music3 = audios[2];

		MusicToggle1 = GameObject.Find("T_Music1");
		MusicToggle2 = GameObject.Find("T_Music2");
		MusicToggle3 = GameObject.Find("T_Music3");
	}
	
	// Update is called once per frame
	void Update () 
	{
		if(MusicToggle1.GetComponent<Toggle>().isOn == true)
		{
			Music1.Play ();
			Music2.Stop ();
			Music3.Stop ();
		}
		if(MusicToggle2.GetComponent<Toggle>().isOn == true)
		{
			Music2.Play ();
			Music1.Stop ();
			Music3.Stop();
		}
		if(MusicToggle3.GetComponent<Toggle>().isOn == true)
		{
			Music3.Play ();
			Music1.Stop ();
			Music2.Stop ();
		}
		
	}

}
Mais avec seulement 2 musique cela fonctionne bien.
Y a t'il une meilleure pratique ou astuces?
Car je voudrais offrir plusieurs choix.

Merci
Dernière édition par marcQC le 01 Nov 2015 06:45, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: Choix de musique

Message par Max » 31 Oct 2015 10:54

Hello,

perso, je ne suis pas sur que multiplier les AudioSources sur un gameobject soit la meilleurs approche.
Partir plutôt sur un quelque chose du genre

Code : Tout sélectionner

	public AudioClip[] theMusics;
...
	private AudioSource audio;

	// Use this for initialization
	void Start () {
		audio = GetComponent<AudioSource>();
		....
	}

...
		audio.clip = theMusics[x];
		audio.Play();
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

marcQC
Messages : 121
Inscription : 30 Nov 2013 18:14

Re: Choix de musique

Message par marcQC » 31 Oct 2015 14:26

Merci mais y a un soucis, le code fonctionne bien, merci.
Mais les musiques ne jouent que si je clic gauche sur logarithmic rolloff ou clic droit sur audioSource dans l'inspecteur et juste sur ca.
Je vois bien les musiques changer dans l'audioSource, Loop activé.

Au début du jeu la musique 1 joue 1 seconde puis arrête, je vais dans mon menu pause je choisi la 2ième, rien, la 3ième rien. je clic dans L'inspecteur et la musique joue je retourne sur le jeu la musique coupe.

Code : Tout sélectionner

using System.Collections;
using UnityEngine.UI;

public class AudioChoice : MonoBehaviour {



	public AudioClip[] Musics;
	private AudioSource Audio;

	public  GameObject MusicToggle1;
	public  GameObject MusicToggle2;
	public  GameObject MusicToggle3;
	

	// Use this for initialization
	void Start () 
	{
		Audio = GetComponent<AudioSource>();

		MusicToggle1 = GameObject.Find("T_Music1");
		MusicToggle2 = GameObject.Find("T_Music2");
		MusicToggle3 = GameObject.Find("T_Music3");
	}
	
	// Update is called once per frame
	void Update () 
	{

		if(MusicToggle1.GetComponent<Toggle>().isOn == true)
		{
			GetComponent<AudioSource>().clip = Musics[0];
			GetComponent<AudioSource>().Play ();


		}
		if(MusicToggle2.GetComponent<Toggle>().isOn == true)
		{
			GetComponent<AudioSource>().clip = Musics[1];
			GetComponent<AudioSource>().Play ();

		}
		if(MusicToggle3.GetComponent<Toggle>().isOn == true)
		{
			GetComponent<AudioSource>().clip = Musics[2];
			GetComponent<AudioSource>().Play ();

		}

		//Debug.Log ("Toggle1" + MusicToggle1.GetComponent<Toggle>().isOn);
		//Debug.Log ("Toggle2" + MusicToggle2.GetComponent<Toggle>().isOn);
		//Debug.Log ("Toggle3" + MusicToggle3.GetComponent<Toggle>().isOn);
	}

}
c'est assez bizarre je trouve, merci

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: Choix de musique

Message par Max » 31 Oct 2015 15:27

Re-hello,

Première chose, tu définis 'Audio = GetComponent<AudioSource>();', alors que dans ton Update tu restes sur des GetComponent.
Que se soit en terme d'opti mais aussi en terme de lecture du code, remplace par 'audio' tous tes 'GetComponent<AudioSource>()' (évite aussi les majuscules pour attaquer les noms de tes variables)

Sinon, sur le fond, ben je dirais que cela dépend de tes paramètres dans la partie 'AudioSource'. Si tu est en mode Custom par exemple, cela prend en compte la distance à laquelle tu te trouve de ta source, ne pas l'oublier. Rester dans ce cas en Logarithmic et un SpatialBlend à 0 par exemple.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

marcQC
Messages : 121
Inscription : 30 Nov 2013 18:14

Re: Choix de musique

Message par marcQC » 31 Oct 2015 16:50

Oui effectivement c'était juste un test en enlevant dans le start.

Mais cela ne change rien, ce qui est étrange c'est que si je clic en dehors de ma scène Game, cela coupe le jeu et là j'ai la musique de mon choix, donc ton code est bon.
Mais si je re-clic sur ma scène Game bah plus rien.

J'ai tester en changeant les toggles par un Input alpha, tout fonctionne bien, y aurait il un bug avec les Toggles ou un appel autre que dans Update?

En bas à gauche ma scène Game avec mon choix de musique 2.
dans Hiérarchie. empty Gameobject pour test.
A droite le script et 1 seule Audiosource, je ne touche pas au rollfoff.

Image.

Je remets le code comme il faut.

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class AudioChoice : MonoBehaviour {

	/*public AudioSource Music1;
	public AudioSource Music2;
	public AudioSource Music3;*/
	public AudioClip[] Musics;
	public AudioSource audio;

	public  GameObject MusicToggle1;
	public  GameObject MusicToggle2;
	public  GameObject MusicToggle3;


	// Use this for initialization
	void Start () 
	{
		audio = GetComponent<AudioSource>();

		/*AudioSource[] audios = GetComponents<AudioSource>();
		Music1 = audios[0];
		Music2 = audios[1];
		Music3 = audios[2];*/

		MusicToggle1 = GameObject.Find("T_Music1");
		MusicToggle2 = GameObject.Find("T_Music2");
		MusicToggle3 = GameObject.Find("T_Music3");
	}
	
	// Update is called once per frame
	void Update () 
	{

		if(MusicToggle1.GetComponent<Toggle>().isOn == true)
		{
			audio.clip = Musics[0];
			audio.Play ();
			/*Music1.Play ();
			Music2.Stop ();
			Music3.Stop ();*/

		}
		if(MusicToggle2.GetComponent<Toggle>().isOn == true)
		{
			audio.clip = Musics[1];
			audio.Play ();
			/*Music2.Play ();
			Music1.Stop ();
			Music3.Stop();*/

		}
		if(MusicToggle3.GetComponent<Toggle>().isOn == true)
		{
			audio.clip = Musics[2];
			audio.Play ();
			/*Music3.Play ();
			Music1.Stop ();
			Music2.Stop ();*/

		}

		//Debug.Log ("Toggle1" + MusicToggle1.GetComponent<Toggle>().isOn);
		//Debug.Log ("Toggle2" + MusicToggle2.GetComponent<Toggle>().isOn);
		//Debug.Log ("Toggle3" + MusicToggle3.GetComponent<Toggle>().isOn);
	}

}

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: Choix de musique

Message par Max » 31 Oct 2015 18:11

marcQC a écrit :y aurait il un bug avec les Toggles ?
Non, pas à ma connaissance.

En lisant vite fait le code, je vois que tu fais des 'MusicToggleX = GameObject.Find("T_MusicX");' alors que tes variables publiques sont assignées dans l'inspector, c'est normal ?
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

marcQC
Messages : 121
Inscription : 30 Nov 2013 18:14

Re: Choix de musique

Message par marcQC » 31 Oct 2015 18:57

Oui cela est normal , le screen est pris IN_Game.
Tout fonctionne bien sauf la lecture, en faisant avec des touches c'est parfait mais pas avec les Toggles,je pense à un bug ou besoin d'une autre manière pour vérifier si .isOn est cochez ou pas.

Merci

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: Choix de musique

Message par Max » 31 Oct 2015 19:32

D'une façon générale, pourquoi ne pas passer par un truc genre eventtrigger sur chacun de tes 3 toggle, appelant une fonction du genre 'ChoiceMusic(num)' ? Cela serait hachement plus simple, non (et pis c'est fait pour cela) ?
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

marcQC
Messages : 121
Inscription : 30 Nov 2013 18:14

Re: Choix de musique

Message par marcQC » 31 Oct 2015 19:36

Je vois pas ce que tu veux dire.
J'ai testé avec des bouttons c'est le même résultat.
Dernière édition par marcQC le 31 Oct 2015 19:46, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: Choix de musique

Message par Max » 31 Oct 2015 19:40

Arf. Connais tu cette vidéo ? (si non, cela devrait te rendre service) ;)

https://unity3d.com/learn/tutorials/mod ... t-triggers
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « (C#) CSharp »