[RESOLU] Couper la musique/sons dans les options

Questions à propos de la partie audio, y compris les problèmes de script s'y rapportant.
Toma44
Messages : 6
Inscription : 09 Jan 2018 18:36

[RESOLU] Couper la musique/sons dans les options

Message par Toma44 » 09 Jan 2018 21:08

Bonjour à toutes et à tous.
Je me suis attaquer aux sons et à la musique de mon jeu, en commençant par les menus.
Je voulais que la musique du menu se joue sans discontinuer d'une scène du menu a une autre. Pour ça j'ai fais un Gameobject "Music" avec un script et "DontDestroyOnLoad", ça fonctionne nickel.
Maintenant Lorsque je veux couper le son dans le menu "settings" c'est la que ça ne fonctionne pas. Je vous met mes script histoire de vous faire une idee:

Le Script pour la musique:

Code : Tout sélectionner

public class MusicScript : MonoBehaviour {

    public static MusicScript instance = null;
    public SettingsScript Settings;
    AudioSource Audio;
    public GameObject settings;

    private void Awake()
    {

        
       
        // Vérifie si l'instance existe déjà
        if (instance == null)
        {
            // Si ce n'est pas le cas, définit l'instance à celle-ci
            instance = this;
        }
        // Si l'instance existe déjà et que ce n'est pas celle-ci :
        else if (instance != this)
        {
            // Alors détruit celle-ci. Cela applique le pattern Singleton, signifiant que nous ne pouvons avoir qu'une et seulement une instance de GameManager.
            Destroy(gameObject);
            
        }

        DontDestroyOnLoad(gameObject);
    }

    private void Start()
    {
         Settings = settings.GetComponent<SettingsScript>();
        Audio = GetComponent<AudioSource>();


    }

    void Update ()
    {
        

        if (Settings.MusicToggle == false)
        {
            Audio.mute = true;
            Debug.Log("ta gueule");
        }
        else
        {
            Audio.mute = false;
        }

        }
	}
Le script pour les options

Code : Tout sélectionner

 public GameObject soundon;
    public GameObject soundoff;
    public GameObject musicon;
    public GameObject musicoff;
    

    public bool soundToggle = true;
    public bool MusicToggle = true;



    void Start ()
    {
        
	}


    
    
    void Update ()
    {
		if (soundToggle == true)
        {
            soundoff.SetActive(false);
            soundon.SetActive(true);
            
        }
        if (soundToggle == false)
        {
            soundoff.SetActive(true);
            soundon.SetActive(false);
           
       }
        if (MusicToggle == true)
        {
            musicoff.SetActive(false);
            musicon.SetActive(true);
            
        }
        if (MusicToggle == false)
        {
            musicoff.SetActive(true);
            musicon.SetActive(false);

           
        }

    }

    public void Sound()
    {
        soundToggle = !soundToggle;

    }

    public void Music()
    {
        MusicToggle = !MusicToggle;
    }

    public void MainMenu()
    {
        SceneManager.LoadScene("MainMenu");
    }
}
Voila, pour les codes, sinon pour expliquer un peu, le gameobject settings est en fait le canvas ou est attaché le script Settings, que j'essaye de récupérer afin d'avoir la variable boolean "musictoggle". J'ai assigné le Canvas au script dans l'inspector mais rien n'y fait.
Voila, alors j’espère avoir été clair, merci de m’aider si vous avez une idée sur la source de mon problème.

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

Re: Couper la musique/sons dans les options

Message par boubouk50 » 10 Jan 2018 10:13

Salut,

2 choses:
1/ Tu n'as pas d'erreur console? Est-ce que les champs publics sont bien remplis? La musique et les sons sont bien présents dans la scène où se situe ce script?

2/ il faut revoir déjà tes conditions et le fonctionnement de ton Update ().
Ça c'est caca:

Code : Tout sélectionner

void Update ()
    {
		if (soundToggle == true)
        {
            soundoff.SetActive(false);
            soundon.SetActive(true);
            
        }
        if (soundToggle == false)
        {
            soundoff.SetActive(true);
            soundon.SetActive(false);
           
       }
        if (MusicToggle == true)
        {
            musicoff.SetActive(false);
            musicon.SetActive(true);
            
        }
        if (MusicToggle == false)
        {
            musicoff.SetActive(true);
            musicon.SetActive(false);

           
        }

    }
Pourquoi c'est caca? parce que tu fais 2 conditions successives inverses au lieu de faire un if - else. Parce que tu le mets dans un Update donc ce code est exécuté à chaque frame, or il ne doit l'être seulement lorsqu'un toggle est modifié.

Code : Tout sélectionner

//Fonctions a appeler lorsque le toggle change d'état.

public void SoundToogle () {
	//Pas besoin de condition, puisque le son dépend directement du toggle
	soundon.SetActive (soundToggle);
	soundoff.SetActive (!soundToggle);
}

public void MusicToogle () {
	//Pas besoin de condition, puisque le son dépend directement du toggle
	musicon.SetActive (MusicToggle );
	musicoff.SetActive (!MusicToggle );
}
Si tu as ton propre toggle sans événement, alors tu peux tester le changement d'état depuis l'Update () (Même si c’est mieux de créer un événement plutôt).

Code : Tout sélectionner

void Update ()
{
	if (soundon.activeself != SoundToggle)
		SoundToogle ();
	if (musicon.activeself != MusicToggle)
		SoundToogle ();
}
"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

Toma44
Messages : 6
Inscription : 09 Jan 2018 18:36

Re: Couper la musique/sons dans les options

Message par Toma44 » 10 Jan 2018 11:58

boubouk50 a écrit :
10 Jan 2018 10:13



1/ Tu n'as pas d'erreur console? Est-ce que les champs publics sont bien remplis? La musique et les sons sont bien présents dans la scène où se situe ce script?
Salut et merci de ta réponse, alors non je n'ai pas d'erreur console d’où le fait que ne sait pas d’où vient le problème.


Concernant les champs public le gameobject settings du gameobject music est assigné et bien présent dans l'inspector lorsque je passe en mode play d'une scene a l'autre.


Image


les variable musictoggle et soundtoggle ne sont pas des toggle d'unity mais juste des boolean pour activer et désactiver les deux image musicon et musicoff et soundoff soundon qui correspondent a des cases cochées et décochées.


La musique est bien présente puisqu'elle se joue quand je passe d'une scène a l'autre.

Merci pour ton script je vais tester ça, ça fait 3 mois que je suis sur unity et sur la programmation, du coup je ne connais pas toutes les subtilités, mais en gros je dois éviter de passer par l'update pour des actions ponctuelles c'est ça? la j'ai quand même creer une fonction "Sound" et "music" pour mes boutons, c'est pas suffisant?

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

Re: Couper la musique/sons dans les options

Message par boubouk50 » 10 Jan 2018 12:48

"On" a la fâcheuse tendance à penser que l'Update () est un fourre-tout indispensable. Mais il est gourmand et très souvent dispensable pour les actions/événements.
En effet, l'Update () est appelé à chaque frame, donc est exécuté et calcule à chaque frame. Le supprimer revient donc à éviter ces calculs et donc à optimiser le jeu.
Un événement à l'inverse est appelé à un instant t, donc est exécuté et calcule seulement pendant la frame de son appel.
Si dans 10 minutes de jeu à 30fps, tu as fait appel 2 fois au menu, tu auras exécuté seulement 2 fois le code d'un événement, alors que si tout est dans l'Update (), il sera exécuté 10x60x30 soit 18000 fois. Tu saisis l'optimisation du coup. De plus, un Update () même vide prend déjà pas mal de ressources.
Seul, ce n'est pas si grave. Mais si tous tes scripts possèdent un update () obsolète, cela revient à faire beaucoup de calculs pour rien. C'est donc une bonne habitude d'essayer de se proscrire des Update () inutiles dans un premier temps. (Bon, tu peux aussi avoir un seul Update global pour tout, etc, mais on en est pas là).

Tes toggles sont donc des boutons? Tu as un clic associé? Il te faudrait associer ses clics aux fonctions de Play/Stop de la musique/son.
"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

Toma44
Messages : 6
Inscription : 09 Jan 2018 18:36

Re: Couper la musique/sons dans les options

Message par Toma44 » 10 Jan 2018 13:27

Oui effectivement je vois bien ce que tu veux dire concernant l'update j'ai d’ailleurs modifier mon script en conséquence.

Pour mes boutons effectivement j'ai associé mon clic a la méthode "public void sound" et "public void music" sur deux boutons différents.

J'ai essayé dans mon script music d'aller chercher la variable "musictoggle" et de mute le son "Audio.mute = true" , d'ailleurs le DebugLog ne s'affiche même pas.

Toma44
Messages : 6
Inscription : 09 Jan 2018 18:36

Re: Couper la musique/sons dans les options

Message par Toma44 » 10 Jan 2018 14:17

Bon alors, après avoir essayé autre chose j'ai remis mon script comme c’était, et la bizarrement ça a fonctionné... enfin seulement lorsque je met le prefab dans la scenen settings, quand je demarre a partir du menu principal et que je vais sur ma scene settings, la ça ne fonctionne pas!
Dernière édition par Toma44 le 10 Jan 2018 15:35, édité 1 fois.

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

Re: Couper la musique/sons dans les options

Message par boubouk50 » 10 Jan 2018 15:06

On essaie d'aider au mieux. ;-)

Aussi, lorsque le sujet est résolu , merci de penser à ajouter [RESOLU] en début de titre du premier post en l'éditant. Ça permet aux autres membres de savoir que la solution est trouvée. je m'en occupe cette fois-ci
"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

Répondre

Revenir vers « Audio, musique et sons »