[RESOLU]Mouse audio listener?

Modérateur : Administrateurs Suppléants

Avatar de l’utilisateur
1300vrtical
Messages : 22
Inscription : 17 Nov 2018 17:02

Re: Mouse audio listener?

Message par 1300vrtical » 21 Nov 2018 18:49

:merci: Super merci! :merci: Tout fonctionne du tonnerre bien à présent, et le tout sous couvert pédagogique ! bien joué ::d

:mrgreen: j'aurais une autre requête à présent (est-ce que je fais un nouveau suget ou pas ?):
Comment ça se passe si je veux que tous les sons s'arrête lorsque je clique sur un des objets audio source et quand on clique en de retour le systèm son redevienne à la normale ?
Est-ce qu'il ne faut pas que je crée un ARRAY avec tous les sons (18) pour pouvoir plus facilement les gérer ?

Code : Tout sélectionner

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


public class FadeSound : MonoBehaviour
{
    private float scale = 2.0f;
    public float ToFade;
    AudioSource m_MyAudioSource;

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

    void OnMouseOver()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 100))
        {

            // trace une ligne rouge de debug depuis le centre du transform jusqu'au point d'interessection du raycast.
            Debug.DrawLine(transform.position, hit.point, Color.red);
            // calcul de la distance entre deux points, en unité.
            // scale est pour l'echelle, si ton plan fait 10 de coté, le scale devra etre de 5.0f 
            //pour que fade soit compris entre 0 ( contacte au centre) et 1 ( contacte àla limite du planeCollider)
            ToFade = (transform.position - hit.point).magnitude / scale;

            // Clamper ToFade pour qu'il ne depasse pas 1.0f ( si t'es dans un coin du planeCollider, tu sors du cerlce inscrit au carré
            ToFade = Mathf.Clamp01(ToFade);
            
            m_MyAudioSource.volume = 1 - ToFade; // j'ai mis un peux de temps a comprendre le truc du 1 - ToFade pour inversé le 0 et le 1

        
        }
        if (Input.GetMouseButton(0)) //code pour le maintien de la sourie
        {
             ToFade = 0;
            m_MyAudioSource.volume = 1;
        }
           

    }

}
https://vimeo.com/302111044

PS: J'ai testé le jeu 🐑 mais je n'ai pas réussi à passer le premier niveau MDR!
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 4732
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Mouse audio listener?

Message par boubouk50 » 21 Nov 2018 19:16

Tu peux les récupérer tous d'un coup grâce à FindObjectsOfType

Exemple source: https://answers.unity.com/questions/194 ... audio.html
"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

Avatar de l’utilisateur
1300vrtical
Messages : 22
Inscription : 17 Nov 2018 17:02

Re: Mouse audio listener?

Message par 1300vrtical » 22 Nov 2018 12:28

Bonjour,
:-D Merci pour les indications. Mais je n'y arrive vraiment pas. :pleur4:
En créant deux objets avec le script FadeSound lorsque je clique sur l'un d'eux et que je passe sur le second les deux objets ont leur volume au maximum(1). Est-ce que je dois créer un script Fadesound différents pour chaque objet avec une audio source? Et lorsque j'ajoute les quelques lignes montrer dans l'exemple précédent toutes les sources audio se mute. J'ai essayé de mettre ça dans une boucle do while et un IF Statement. Et j'ai essayé de mettre le son auquel est attaché l'objet en exception, je ne comprend pas pourquoi ça ne marche pas. :|

Code : Tout sélectionner

        if (Input.GetMouseButton(0))
        {
            ToFade = 0;
            m_MyAudioSource.volume = 1;

            allAudioSources = FindObjectsOfType<AudioSource>() as AudioSource[];   
            foreach (AudioSource audioS in allAudioSources.Except(m_MyAudioSource)) // je n'arrive pas a faire une exeption à mon Audiosource de mon objet actuel
            {
                audioS.mute = true; //ça rend tout muet tout le temps :,( 

            }

        }
    }
Cordialement. :merci:
Merci à ceux qui m'aiderons :super:


1300vrtical
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 4732
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Mouse audio listener?

Message par boubouk50 » 22 Nov 2018 12:47

mute = true met le son à zéro
mute = false remet le son au niveau de la coupure.
Changer le volume désactive le mute.
Donc rien qu'avec cela, tu devrais t'en sortir si tu fais une variation de volume.

La question importante: combien de fois ce script est présent? Pour tous les audioSources? Si c’est le cas, alors GetMouseButton(0) sera activé pour chacun des scripts. Peut-être souhaites-tu ne l'activer que pour un seul? Tu pourrais utiliser OnCollisionEnter () ou alors laisser chacun des scripts se gérer seul, c'est à dire, que pour chaque clic, si c'est l'objet cliqué on met le son à 1, sinon à 0. Ainsi, chacun des audioSources se coupera par lui-même.

Ensuite, tu veux surement utiliser GetMouseButtonDown () qui ne vaut vrai que lors du clic, alors qu'ici c'est tant que le bouton de la souris est enfoncé.
Aussi, tu peux tout couper, dans ce cas, réactive le bon son (mute = false)
Également, il vaut mieux faire le Find () au Start () et stocker tous les audioSources une bonne fois pour toute. Le Find () est très gourmand.


Dans l'idée, vu que je n'ai pas l'intégralité du script, soit tu crées un Manager de son, qui gère tout tout seul, soit chacune des occurrences du script se gèrent elles-mêmes. Ici, tu as l'air de mélanger les deux, ce qui donne toujours des nœuds à résoudre et est une pas si bonne approche.
"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

djulio74
Messages : 432
Inscription : 19 Déc 2009 22:55
Contact :

Re: Mouse audio listener?

Message par djulio74 » 22 Nov 2018 13:43

Comme dit Boubouk50, tu as deux façons de faire.

pour un script par GameObject produisant un son :
- avoir une variable bool IsOver
- avoir une variable bool IsActive
- quand la souris passe sur l'object (OnMouseEnter) tu passe IsOver a true;
- quand la souris sors de l'object OnMouseExit), tu passe IsOver a false
(void Update) :
- quand tu clique : --> IsActive = isOver;
- si isActive = true --> le volume a 1
- sinon :
--> si IsOver est true : le volume est ToFade.
--> volume est a zéro

pour un seul script :
Il te faut un seul script genre sur la camera, un seul raycast permanent ( void Update).
que tu recupere l'audioSource de l'objet touché par le raycast, calcul de ToFade en fonction de la position du point de contact et de l'objet touche, assigné a l'audioSource de l'objet touché le volume voulu;
Si tu veux activer un seul son a la fois, il te faudra avoir une variable AudioSource grenre ActualAudio
- si tu clique et que que le rayon touche un objet:
-- si l'audioSource de l'objet touché est différent de ActualAudio, tu passe mute a true pour ActualAudio (s'il y en a un tu lui coupe le son) , mute a false pour l'objet touché et remplace ActualAudio par l'audioSource de l'objet touché.
-- si c'est le même ( tu a recliqué sur le même ), tu inverse son bool mute


C'est vraiment schématisé mais pour te montrer deux des façon de faire possible

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
1300vrtical
Messages : 22
Inscription : 17 Nov 2018 17:02

Re: Mouse audio listener?

Message par 1300vrtical » 22 Nov 2018 16:28

Merci pour cette indication logique des choses.
J'ai utilisé la méthode du script par GameObject car plus facile à mettre en place pour moi. Cependant j'aurais une question est-ce que la seconde méthode n'est-elle pas moins gourmande en ressources ?
Je vais laisser un peu de côté le son sur ce projet pour pouvoir avancer sur mon modèle technique.
J'ai une transformation scripter et un panneau défilant ui à faire au plus vite.
:coeur: Merci pour toutes les indications audio à l'écrit. :coeur:

Code : Tout sélectionner

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



public class FadeSound : MonoBehaviour
{
    private bool isOver;
    private bool isActive;
    private float scale = 2.0f;
    public float ToFade;
    AudioSource m_MyAudioSource;
   
    

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

    void OnMouseOver()
    {
        isOver = true;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 100))
        {

            // trace une ligne rouge de debug depuis le centre du transform jusqu'au point d'interessection du raycast.
            Debug.DrawLine(transform.position, hit.point, Color.red);
            // calcul de la distance entre deux points, en unité.
            // scale est pour l'echelle, si ton plan fait 10 de coté, le scale devra etre de 5.0f 
            //pour que fade soit compris entre 0 ( contacte au centre) et 1 ( contacte àla limite du planeCollider)
            ToFade = (transform.position - hit.point).magnitude / scale;

            // Clamper ToFade pour qu'il ne depasse pas 1.0f ( si t'es dans un coin du planeCollider, tu sors du cerlce inscrit au carré
            ToFade = Mathf.Clamp01(ToFade);
            
            m_MyAudioSource.volume = 1 - ToFade;

        
        }
        if (Input.GetMouseButton(0))
        {
            ToFade = 0;
            m_MyAudioSource.volume = 1;
            isActive = isOver;
            if (isActive = isOver)
            {
                m_MyAudioSource.volume = 1;
            }
            else
            {
                if (isOver = true)
                {
                    m_MyAudioSource.volume = 0;
                }
                

            }
           

        }
         
           
        
    }
    void OnMouseExit()
    {
        isOver = false;
    }

 }


Ps: vaut-il mieux que je crée un sujet autour de mon projet (vos créations, jeux, démo...) ou que je pose des questions sur différents forums en fonction pour la suite de mes pérégrinations sur unity ?
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 4732
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Mouse audio listener?

Message par boubouk50 » 22 Nov 2018 17:02

Crée un sujet par difficulté rencontrée. Il vaut mieux séparer, ce n'est pas que pour toi mais aussi pour ceux qui chercheraient des réponses.
Vite fait quelques trucs (en commentaire):

Code : Tout sélectionner

if (Input.GetMouseButtonDown (0)) //Utilise le DOWN -> Un seul appel
        {
            ToFade = 0;
            m_MyAudioSource.volume = 1; //Tu affectes à 1
            isActive = isOver;
            
            if (isActive = isOver)//ATTENTION: tu affectes isActive, tu ne le compares pas. Aussi, pourquoi le comparer puisque tu viens de l'affecter avec isOver??? -> Comparer avec ==
            {
                m_MyAudioSource.volume = 1; //Pas besoin d'affecter c'est déjà fait. Il te faut juste définir les cas ou tu mets à 0
            }
            else
            {
                if (isOver = true)//ATTENTION: pareil affectation pas comparaison
                {
                    m_MyAudioSource.volume = 0;
                }
             }
        }
Le code utile et corrigé (si j'ai bien compris, avec toutes les erreurs pas évident)

Code : Tout sélectionner

if (Input.GetMouseButtonDown (0)) //Utilise le DOWN -> Un seul appel
{
            ToFade = 0;
            isActive = isOver; //Pas nécessaire puisque isOver fait le taff ici (peut être ailleurs dans le code par contre)
            m_MyAudioSource.volume = isOver ? 1 : 0; //Condition simplifiée -> si isOver est vrai alors volume = 1 sinon volume = 0
}
 
"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

djulio74
Messages : 432
Inscription : 19 Déc 2009 22:55
Contact :

Re: Mouse audio listener?

Message par djulio74 » 22 Nov 2018 17:52

nan justement boubouk50, il a une différence entre IsOver et IsActive.
IsActive peut rester true même si on sors du collider, repase forcément a false si on clique ailleur que sur le collider.
IsOver sert a determiner si la souris est dans le collider.

La différence des deux sert a forcer le volume sur 1 si on a cliqué, ou utiliser la distance du hitPoint

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 = 0.0f;
	float scale = 1.0f;
	AudioSource MyAudio;


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

	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 = 0.0f;
	}

	void Update ()
	{
		// quand on clique avec la souris
		if (Input.GetMouseButtonDown (0)) {
			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;
			}
		}

		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);
		}
	}
}
Ou du moins c'est comme cela que je voyais le problème de notre ami 1300vrtical ;-)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
1300vrtical
Messages : 22
Inscription : 17 Nov 2018 17:02

Re: Mouse audio listener?

Message par 1300vrtical » 23 Nov 2018 13:17

Bonjour,
J'ai essayé vos solutions hier soir:
  • Celle de boubouk50 qui ressembles à celle que j'ai envoyée mais en beaucoup plus élégante (moins de ligne plus de précisions). Mais les effets djulio74 mêmes.
  • Celle de djulio74 je n'arrive pas à voir pourquoi, j'y ai réfléchi toute la soirée et toute la nuit(car à présent je rêve de code) mais tout est inversé. Le son est à 1 lorsque le jeu commence et plus je m'approche du centre, plus j'ai mon son qui passe à zéro. :bombe:J'en deviens gaga :bombe: .

Mais étant donné que je veux faire une exportation webgl ne vaudrait-il mieux pas que je refasse mon script sur la caméra ? Pour économiser un max de ressources.


Je reviendrai un peu plus tard sur les problèmes de son car je dois me concentrer sur d'autres aspects du projet (rotation plus animations, UI et export webgl).


:merci: Merci pour tout :merci: j'espère revenir d'ici une petite semaine.
Cordialement 1300vrtical
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:

Avatar de l’utilisateur
1300vrtical
Messages : 22
Inscription : 17 Nov 2018 17:02

Re: Mouse audio listener?

Message par 1300vrtical » 30 Nov 2018 17:56

Bonjour, :hello:
le projet est en bonne voie de construction grâce au code djulio74. Après quelques menus ajustements, je peux vous montrer un Modèle d'intention.
Un tout petit point me chagrine malgré tout, lorsque je clique sur le gros blocs rouge pour ouvrir le menu, le son s'arrête. Y aurait-il moyen exclure le clic sur cet objet pour que l'on puisse continuer malgré le menu soit ouvert.
Je vous remercie grandement de votre aide! :coeur:

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)) {
			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;
			}
		}

		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);
		}
	}
}

cordialement
1300vrtical
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:

Répondre

Revenir vers « Audio, musique et sons »