Mute/Unmute un Audiosource dans toutes les scènes

Questions à propos de la partie audio, y compris les problèmes de script s'y rapportant.
Liamalec
Messages : 4
Inscription : 23 Juil 2017 18:18

Mute/Unmute un Audiosource dans toutes les scènes

Message par Liamalec » 23 Juil 2017 18:40

Bonjour/Bonsoir ! Je cherche une solution pour mon problème d'audiosource. Je crée un petit jeu 2D et j'ai ajouté un menu option avec un bouton "Mute/Unmute" avec un script en C# qui travaillait comme ceci:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Mute : MonoBehaviour
{
   private AudioSource audioSource;


    void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }
    public void Mutemusic()
    {
        if (audioSource.mute) { audioSource.mute = false; }
        else{ audioSource.mute = true; }
    }
}  
Je pouvais mute et Unmute la musique tant que je restait dans la même scène mais je me suis rendu compte que quand je changeait de scène le bouton ne marchait plus car la variable boolean n'était plus la même (par exemple quand j'activais mute et que je changeais de scène cela restait en mute)


Du coup après j'ai pensé qu'avec PlayerPrefs je pouvait stocker un key int et que quand elle était sur 0 le son n'était pas mute et quand il est sur 1 le son est mute, alors j'ai fait ça:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Mute : MonoBehaviour
{
   private AudioSource audioSource;
    

    void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }
    
    public void Update()
    {
        

        if (PlayerPrefs.GetInt("isMuted") == 1) { audioSource.mute = true; }
        else if(PlayerPrefs.GetInt("isMuted") == 0) { audioSource.mute = false; }
    }
    public void Muting()
    {
        if (PlayerPrefs.GetInt("isMuted") == 1)
        {
            PlayerPrefs.SetInt("isMuted", 0);
        }
        else if(PlayerPrefs.GetInt("isMuted")== 0)
        {
            PlayerPrefs.SetInt("isMuted", 1);
        }
    }
}  
Et là c'est la même chose, je peux mute/unmute tant que je suis dans la même scène mais dès que je change cela ne marche plus et le PlayerPrefs reste sur 1 (je pense) donc concrètement le son reste mute :(



Pourriez-vous m'indiquer si je peux corriger mon script ou alors utiliser une autre méthode pour (je le répète) pouvoir Mute/Unmute en changeant de scène (si je mute dans la scène 1 ça reste mute à toutes les scènes et je peux Unmute quand je veux)

Désolé je me répète beaucoup mais j'avais envie d'expliquer au mieux

Merci d'avance! ( =

PS: l'Audiosource ne recommence pas à chaque scène, il a un script DontDestroyOnLoad

Nazarick
Messages : 60
Inscription : 03 Avr 2017 21:44

Re: Mute/Unmute un Audiosource dans toutes les scènes

Message par Nazarick » 24 Juil 2017 07:30

Je ne suis pas sur Unity depuis deux bonnes semaines donc j'y vais de tête, tu utilises un AudioMixer ? (La gestion via les snapshots de ce dernier est vraiment très pratique et permet entre autre de gérer des groupes d'audioSource en une seule fois)

Juste pour être sûr ton deuxième script c'est une nouvelle version du premier ou un second script attaché au même GameObject que le premier ? Le component AudioSource est bien mis sur le GameObject utilisant le DontDestroyOnLoad ?


Code : Tout sélectionner

public void Update()
{
if (PlayerPrefs.GetInt("isMuted") == 1) { audioSource.mute = true; }
else if(PlayerPrefs.GetInt("isMuted") == 0) { audioSource.mute = false; }
}
Personnellement j'évite de telle méthode, là il va chercher à chaque frame les données de "isMuted" dans PlayerPrefs, ce qui est inutile et sur la longue peut devenir gourmand en ressources. Ce type de condition, il vaut mieux les utiliser uniquement pour des évènements précis (le changement depuis le menu par l'utilisateur, à la fin d'un (re)chargement de scène si nécessaire)).

De même les options de ton menu, tu les recharges avec les valeures enregistrées à quel moment ? Une seule fois au premier lancement du menu ? Ou a chaque réveil du menu ? Personnellement pour mes menus, je vérifie l'état des différents toggle, slider et compagnie à chaque enable de mon menu (activation/réactivation), ainsi je suis sûr qu'ils correspondent au données précédement enregistrées par l'utilisateur et donc pas de problème comme tu as.

Liamalec
Messages : 4
Inscription : 23 Juil 2017 18:18

Re: Mute/Unmute un Audiosource dans toutes les scènes

Message par Liamalec » 24 Juil 2017 10:43

Alors déjà merci de ta réponse. J'ai fait le 2ème script comme une amélioration du premier donc non il n'y sont pas les deux en même temps. Et oui l'Audiosource est sur le GameObject avec le script DontDestroyOnLoad (C'était pour que la musique ne s'arrête pas entre les scènes). Et pour les valeurs du menu tout est aussi dans la fonction Update,:gene: enfin évidemment j'ai mis deux fonctions en dessous pour les boutons. (Je mets le script pour le menu en même temps) Il y a 2 menus dans le même script: un menu pause et un options.

Code : Tout sélectionner

var menuObject : GameObject;
var optionsObject : GameObject;
 var isActive : boolean = false;
var isActiveOptions : boolean = false;

function start (){

}


function Update () {
	// MENU EST AFFICHE
	
	
	if(isActiveOptions == true){
		optionsObject.SetActive(true);
		menuObject.SetActive(false);
	}else{
	optionsObject.SetActive(false);
	}
	
	if(isActive == true && isActiveOptions ==false){
	menuObject.SetActive(true);
	Time.timeScale = 0;
	Cursor.visible = true;
	Cursor.lockState = CursorLockMode.Confined;
	
		}
		else if(isActive == true || isActiveOptions == true){
		Cursor.visible = true;
	Cursor.lockState = CursorLockMode.Confined;
	Time.timeScale = 0;

		}

	else{
	menuObject.SetActive(false);
	Cursor.visible = true;
	Cursor.lockState = CursorLockMode.Confined;
	Time.timeScale = 1;
	}



	if(Input.GetKeyDown(KeyCode.Escape)&&isActiveOptions == false){
	ResumeButton();

	}
	if(Input.GetKeyDown(KeyCode.Escape)&& isActiveOptions == true){
		OptionsButton();
	}
	}
	function ResumeButton(){
	isActive = !isActive;
	}
	function OptionsButton(){
		isActiveOptions = !isActiveOptions;
	}


Mais pour garder la variable boolean entre les scènes "isMuted" comment est-ce que je pourrais m'y prendre sans un PlayerPrefs?
Car sinon cela ne modifie pas cette valeur dans les autres scènes (par exemple le son est mute dans la première scène *changement de scène* et dans la 2ème le script est positionné sur "pas mute" alors que le son est mute depuis la 1ère, et là, ça bug :triste1:

Sinon j'ai pas pensé à essayer un audiomixer et en même temps je suis assez débutant donc je ne sais pas très bien comment je pourrais m'y prendre avec mais je vais me renseigner et je te redis.
Merci en tout cas ;-)

Liamalec
Messages : 4
Inscription : 23 Juil 2017 18:18

Re: Mute/Unmute un Audiosource dans toutes les scènes

Message par Liamalec » 25 Juil 2017 12:42

Bonjour alors j'ai regardé avec un audiomixer mais ce que je cherche ce n'est pas à faire des groupes pour les mute tous ensemble, c'est de mute un audiosource qui a un DontDestroyOnLoad dans toutes les scènes et je ne sais vraiment pas comment faire et si c'est possible de le faire avec un audiomixer.
HELP! :snif:

Liamalec
Messages : 4
Inscription : 23 Juil 2017 18:18

Re: Mute/Unmute un Audiosource dans toutes les scènes

Message par Liamalec » 25 Juil 2017 19:02

Alors après multiples recherches en vain, j'ai pensé à juste utiliser de la compétence AudioListener.volume https://docs.unity3d.com/ScriptReferenc ... olume.html

Et j'ai pu résoudre le problème car l'AudioListener reste au même volume jusqu'à ce qu'on le redéfinisse avec un simple code comme ça:

Code : Tout sélectionner

 public void MuteMusic()
    {
        if(AudioListener.volume == 0.0F){
            AudioListener.volume = 1.0F; }
            else{ AudioListener.volume = 0.0F;
        }
    }
Alors bien sûr ça ne mute pas l'audiosource en lui même mais ça donne le même résultat alors tant mieux!
Bref, merci beaucoup quand même pour ton aide.

Répondre

Revenir vers « Audio, musique et sons »