Page 3 sur 3

Re: Mouse audio listener?

Publié : 30 Nov 2018 18:09
par djulio74
Pas encore regardé ton lien mais pour ta question :
ça va pas être simple car chaque audioSource est autonome dans son script : si tu clique en dehors de lui, son propre son se coupe.. Pour palier il faudrait plutôt passer par un seul script, qui gère tout les sons.

Ou alors:
- dans ton script du menu, avoir une static bool. quand tu clique sur le bouton menu, passe a true, quand tu clique ailleurs a false.
- quand tu clique ( dans tes void Update de chaque audioSource), lancer un coroutine, marquer une petite pause d'une demi seconde par exemple ( pour être sur que la static bool ai le temps de changer, en fonction de l'ordre d'execution des scripts), verifier que cette static bool eszt false pour couper le son. Comme ça, quand tu clique sur les GameObject, fonctionnement normal, si tu clique sur le bouton pause, pas de coupure de son.

Re: Mouse audio listener?

Publié : 30 Nov 2018 19:54
par 1300vrtical
Quelle est la solution la moins gourmande en ressources ?
Et si je veux créer un seul script qui gère tous les sons, par où est-ce que je commence ?

Re: Mouse audio listener?

Publié : 30 Nov 2018 20:04
par djulio74
c'est loin d’être des opérations gourmande, d'autant plus qu'elles ne se font qu’épisodiquement.

La solution dans mon "Ou alors" est la plus simple a mettre en oeuvre. Pour l'autre solution de tout centraliser, cest plus performant dans le sens ou tu n'aura plus qu'une void Update qui s'executera, alors que dans le cas "chacun pour soi" il y en a autant que de source audio.

Pour la centralisation en un seul script :
- es-tu au point sur l'utilisation des array/list ?
- es-tu au point sur l'appel d'autres scripts dans un script? interagir entre script et/ou class?
- différence entre public, private, static?

c'est des questions qui peuvent paraitre bête ne connaissant pas ton niveau, mais des domaines que j'ai mis un moment a appréhender/utiliser. ^^

Re: Mouse audio listener?

Publié : 30 Nov 2018 20:19
par 1300vrtical
Oui tu as raison, je n'ai qu'une vague notion des arrey/list et si la solution que tu m'as présenté est la plus simple aussi gourmande alors le rasoir d'Ockham exhorte de l'utiliser !

Re: Mouse audio listener?

Publié : 30 Nov 2018 20:47
par djulio74
elle est plus simple a mettre en place.
Il faut que tu arrive a déterminer quels éléments empêcheront le passage du son en mute ( ton gros cube rouge et ton bouton en haut) => affichage du menu
ensuite quel script fait apparaitre le menu? "MonScriptMenu"
dans ce script, il faut que tu ajoute/declare un nouvelle variable en static :

Code : Tout sélectionner

public static bool CanMute;
dans "MonScriptMenu" il faut pouvoir passer "CanMute" a false quand tu clique sur un des éléments ( bouton, Gros cube), et a true quand tu clique n'importe ou ailleurs.

dans ton script du son, disons "FadeSound", dans ta void Update, tu a une condition in(input..etc) avec directement ce que tu fais si la condition est vrai. il faudra a l'inverse metre ces actions dans un coroutine, que tu lancera quand tu cliquera.
cette coroutine marquera une minipause avant de verifier si si la bool "CanMute" est true. si oui, elle execute les actions, sinon il ne se passe rien.

Code : Tout sélectionner

void Update ()
	{
		// quand on clique avec la souris
		if (Input.GetMouseButtonDown (0)) {
			// lance une coroutine pour couper le son ou non
			StartCoroutine (MuteOrNot());	
		}

		if (IsActive) {
			// si IsActive, on force le volume a 1
			MyAudio.volume = 1.0f;
		} else {
			// sinon on se sert de ToFade pour le volume
			// ToFade qu'on a bien defini a 0 sion est sorti du collider
			MyAudio.volume = 1.0f - ToFade;
		}
	}
il faudra bien évidement avoir la couroutine dans le script donc ajouter :

Code : Tout sélectionner

	IEnumerator MuteOrNot(){
		
		// on attend la fin de la frame, etre sur que CanMute ai été modifié si besoin
		yield return new WaitForEndOfFrame();
		
		// on verifie que la bool CanMute soit bien sur true 
		
		// remplacer MonScriptMenu par le nom du script qui contient CanMute ( ou autre nom)
		// remplacer si besoin CanMute par le nom que tu lui aura donné
		if( MonScriptMenu.CanMute == true){
			if( IsOver){
				//on inverse isActive uniquement si la souris est sur l'objet (mode ON/OFF du volume)
				IsActive = !IsActive;
			}
			else{
				//sinon isActive est forcément faux ( on a cliqué ailleurs que sur l'object, il passe donc forcément inactif)
				IsActive = false;
			}
		}
	}

Re: Mouse audio listener?

Publié : 01 Déc 2018 16:35
par 1300vrtical
Bonjour,
Il doit y avoir un truc que je n'ai pas compris :oops: car je n'arrive pas à faire que mon CanMute de mon script, fonctionne dans mon FadeSound… J'ai essayé de le placer à différents endroits cependant rien ne fonctionne. :-|
Je ne sais pas si je peux donner le code du menu, car je l'ai acheté sur le Unity asset Store, mais il semble fonctionner étant donné que j'ai un print() à la suite de mon CanMute, et que je vois les différents états booléens en fonction du clic sur le gros bloc rouge ou pas.


Qu'est-ce que j'ai bien pu manquer ? :?: :?:

Code : Tout sélectionner

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

public class FadeSound : MonoBehaviour
{
	bool IsOver = false;
	bool IsActive = false;
	public float ToFade ;
	float scale = 1.0f;
	AudioSource MyAudio;
   
  

    void Start ()
	{
		//on recuper l'AudioSource du gameObject
		MyAudio = GetComponent<AudioSource> ();
        ToFade = 1.0f;
      
    }

	void OnMouseEnter ()
	{
		// quand la souris entre dans le collider
		IsOver = true;		
	}

	void OnMouseExit ()
	{
		// quand la souris sors du collider
		IsOver = false;
		// on force ToFade à zero pour etre sur que même avec un mouvement rapide de souris il reste pas un peu de son.
		ToFade = 1.0f;
	}


    void Update()
    {
       
        // quand on clique avec la souris
        if (Input.GetMouseButtonDown(0))
        {


             StartCoroutine(MuteOrNot());//je l'ai mis à la suite comme convenue
              
            if (IsOver)//j'ai remis IsOver car sinon le volume n'était pas à 2 comme prévu lorqu'on clique.
            {
                
                //on inverse isActive uniquement si la souris est sur l'objet (mode ON/OFF du volume)
                IsActive = !IsActive;
            }
            else
            {
                //sinon isActive est forcément faux ( on a cliqué ailleurs que sur l'object, il passe donc forcément inactif)
                IsActive = false;
            }
        }

        if (IsActive)
        {
            
            
            // si IsActive, on force le volume a 1
            MyAudio.volume = 1.0f;
        }
        else
        {
            // sinon on se sert de ToFade pour le volume
            // ToFade qu'on a bien defini a 0 sion est sorti du collider
            MyAudio.volume = 1.0f - ToFade;
        }
    }

    void OnMouseOver ()
	{
		// on calcul ToFade uniquement si la souris est sur le collider
		Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
		RaycastHit hit;
		if (Physics.Raycast (ray, out hit, 100)) {
			Debug.DrawLine (transform.position, hit.point, Color.red);
			ToFade = (transform.position - hit.point).magnitude / scale;
			ToFade = Mathf.Clamp01 (ToFade);
		}
	}

    IEnumerator MuteOrNot()
    {
        // on attend la fin de la frame, etre sur que CanMute ai été modifié si besoin
        yield return new WaitForEndOfFrame();

        // on verifie que la bool CanMute soit bien sur true 

        // remplacer MonScriptMenu par le nom du script qui contient CanMute ( ou autre nom)
        // remplacer si besoin CanMute par le nom que tu lui aura donné
        if (MouseInteraction.CanMute == true)
        {
           
            if (IsOver)
            {
               
                //on inverse isActive uniquement si la souris est sur l'objet (mode ON/OFF du volume)
                IsActive = !IsActive;
            }
            else
            {
               
                //sinon isActive est forcément faux ( on a cliqué ailleurs que sur l'object, il passe donc forcément inactif)
                IsActive = false;
            }
        }
    }

}




Image

Re: Mouse audio listener?

Publié : 01 Déc 2018 17:37
par djulio74
Si tu ne veux pas partager le code entier partage au moins :
- la partie ou tu défini la variable CanMute;
- la partie ou tu assigne la valeur de CanMute.

de plus est-ce que c'est ligne te donne une erreurs.

Code : Tout sélectionner

if (MouseInteraction.CanMute == true)
Ensuite, d’après ton screen, tu dois avoir en effet un problème pour ton CanMute, il semble en permanence sur false, et passe a true juste quand tu clique. alors qu'il devrait etre true en permanence, passer a false quand tu clique sur le grosCube, et le rester, et ne repasser a true que quand tu clique ailleurs du grosCube, et le rester tant tu ne reclique pas sur le grosCube

Re: Mouse audio listener?

Publié : 01 Déc 2018 18:12
par 1300vrtical
Ça marche, c'est formidable :amen: merci pour tout! :coeur:
je n'avais pas compris que le CanMute, tu devais rester en True ou en False en continue, du coup je l'ai indexée sur la fermeture et l'ouverture de mon panneau (Pepito) dans mon UImanager que je peux réveler:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;//qui me permet de faire des transitions de panneaux

public class UImanager : MonoBehaviour {

    public RectTransform Pepito;
    public static bool CanMute;


    // Use this for initialization
    void Start () {
        CanMute = true;
        print(CanMute);
    }
	
	// Update is called once per frame
	public void PepitoBtn()
    {
        
        Pepito.DOAnchorPos(new Vector2(850, 0), 0.5f);//pepito le panneaux qui apparé en cliquant sur le cube.
        CanMute = true;
        print(CanMute);
    }
    public void ClosePepitoBtn()
    {
        Pepito.DOAnchorPos(new Vector2(0, 0), 0.5f);
        CanMute = false;
        print(CanMute);
    }

}
Cordialement
1300vrtical