Page 1 sur 3

[RESOLU]Mouse audio listener?

Publié : 17 Nov 2018 17:57
par 1300vrtical
Bonjour,
Je m'appelle Maxime et je travaille sur un projet de site en 3D isométrique.
J'ai déjà travaillé avec unity avant seulement sur deux projets AR(vuforia) et vr ( je n'ai jamais vraiment eu besoin de coder sur ces précédents projets/pas de gameplay).
Pour ce nouveau projet je n'arrive pas à faire quelque chose qui me semble-t-il doit être très simple !
J'aimerais, comme expliqué sur ce gif, pouvoir augmenter le son de façon douce à l'approche d'un objet et pouvoir bloquer le son en double cliquant sur le centre du trigger.
J'ai compris comment fonctionnait audio source (sur objet) et audio listener(Sur la sourie) mais je n'arrive pas à trouver l'objet sourie dans les assets. Je ne sais pas si je dois passer par du script, et si oui lequel ?
Merci à ceux qui prendront le temps de me répondre en passant par là!

Cordialement
1300vrtical

Re: Mouse audio listener?

Publié : 17 Nov 2018 19:31
par Max
Bonsoir,
1300vrtical a écrit :
17 Nov 2018 17:57
J'ai compris comment fonctionnait audio source (sur objet) et audio listener(Sur la sourie) mais je n'arrive pas à trouver l'objet sourie dans les assets. Je ne sais pas si je dois passer par du script, et si oui lequel ?
Les informations liées à la souris se trouvent dans la partie Input. Tu peux récupérer sa position, l'état des boutons, etc...
Et va falloir scripter, oui.

Re: Mouse audio listener?

Publié : 19 Nov 2018 19:32
par 1300vrtical
Bonjour,
Merci pour votre réponse Max :amen: !
Je pressentais qu'il fallait bien passer par du script pour pouvoir faire ce que je voulais :pleur4: .(n'existe-t-il pas un système nodal pour aider à la création d'un script sur unity ? :?: )

Suite à votre réponse, et en regardant plusieurs tutoriels, je suis tombé sur 2 solutions qui me semble être les bonnes, mais je n'arrive pas à les faire fonctionner correctement :

La première solution consiste a créer un curseur 3D dans le monde qui suit la souris.
Cette solution a pour avantage de me permettre de modifier le volume en fonction de la distance de ma souris, mais le curseur sur la souris x est raccord, alors qu'en y, le curseur ne me permet pas d'aller ni tout en haut ni tout en bas, il y a un décalage. Et je ne sais pas comment faire pour bloquer sur play le son joué en cliquant sur mon objet. Je pense aussi avoir un problème s'il y a un dénivelé, car le curseur ne change pas de Z.

La seconde solution que j'ai trouvé sur internet et d'utiliser audioManager.cs + changeColor.cs. Cette solution a pour elle de pouvoir pointer vers n'importe quel objet affiché et survolé par la souris (mouseHover). Elle ne peut cependant pas prendre en compte l'augmentation du volume en fonction de la distance objet souris et recommence le son joué au début à chaque fois que l'objet sélectionné.
Image

Est-ce que quelqu'un aurait une solution à mon problème s'il vous plaît ?
Merci d'avance à ceux qui prendront le temps de me répondre :amen: ,
Cordialement :hello:
1300vrtical.

ANNEXE:
Code audioManager

Code : Tout sélectionner

using UnityEngine.Audio;
using System;
using UnityEngine;

public class AudioManager : MonoBehaviour {
	public Sound[] sounds;



	void Awake()
	{
		foreach (Sound s in sounds) {
			s.source = gameObject.AddComponent<AudioSource> ();
			s.source.clip = s.clip;
			s.source.loop = s.loop;

			//s.source.outputAudioMixerGroup = mixerGroup;
		}
	}
	public void Play (string name)
	{
		Sound s = Array.Find (sounds, sound => sound.name == name);
		s.source.Play ();
	}
	public void Stop (string name)
	{
		Sound s = Array.Find (sounds, sound => sound.name == name);
		s.source.Stop ();
	}
}
Code changeColor

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class changeColor : MonoBehaviour {

	public Color startColor;
	public Color mouseOverColor;
	bool mouseOver = false;

	void OnMouseEnter(){
		mouseOver = true;
		GetComponent<Renderer>().material.SetColor("_Color", mouseOverColor);
		FindObjectOfType<AudioManager> ().Play ("BBoing");
	}

	void OnMouseExit() {
		mouseOver = false;
		GetComponent<Renderer>().material.SetColor("_Color", startColor);
		FindObjectOfType<AudioManager> ().Stop ("BBoing");
	}
}


Code MouseCorsor qui me permet de mettre un AudioListener sur l'ojb Cursor

Code : Tout sélectionner

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

public class mouseCursor : MonoBehaviour {

	// Use this for initialization
	void Start () {
		Cursor.visible = false;
		
	}
	
	// Update is called once per frame
	void Update () {
		Vector2 cursorPos = Camera.main.ScreenToWorldPoint (Input.mousePosition) ;
		transform.position = cursorPos;
		
	}
}

Re: Mouse audio listener?

Publié : 19 Nov 2018 19:48
par boubouk50
Dans ce cas, je te conseillerai de faire un Physics.Raycast depuis la souris.
Les objets de la scène DOIVENT avoir un collider pour que cette méthode fonctionne, car elle utilise le moteur physique.

Le raycast te renvoie le point de collision entre le vecteur donné (souris depuis la caméra) et le collider de l'objet intersecté. Tu as donc toutes les infos: Objet sélectionné et point dans l'espace sur l'objet donc son 3D.
Tu peux aussi faciliter la tâche du raycast en spécifiant un layer (pour ne pas toucher les éléments indésirables, par exemple)

Re: Mouse audio listener?

Publié : 20 Nov 2018 18:47
par 1300vrtical
Bonjour, N'ayant pas réussi à faire un script de raycasting correct j'en ai acheté un sur le unity asset store. J'ai essayé de le faire fonctionner, mais après moultes d'aventure, il s'avère que ce n'est pas ce que je recherche. Il semblerait que le raycasting soit booléen du coup incompatible avec l'idée du fade non? Je ne comprends pas grand chose aussi, je suis perdu. Et tellement désemparé, je pensais que ce serait beaucoup plus simple.

Existerait-il pas un moyen de renvoyer les informations des objets vers canvas pour pouvoir faire ensuite ce que je veux?

Cordialement


1300vrtical

https://vimeo.com/301882750

Re: Mouse audio listener?

Publié : 20 Nov 2018 19:04
par Sebela
En effet, le raycast renvoie une donnée booléenne, cependant comme dit boubouk tu peux récupérer l'info du hit => point de collision entre ta souris et l'objet, et mesurer la distance entre le centre du gameobject et le hit avec un Vector3.Distance(hit, gameObject)

Re: Mouse audio listener?

Publié : 20 Nov 2018 19:16
par djulio74
Et pourtant avec ce que te suggérais Boubouk50, tu n'avais rien besoin d'acheter.. dommage.
Le rayCast peut lancer un rayon en gros partant de la caméra, passant par le curseur souris et continuant jusqu'a trouver un obstacle.
D'un poit de vue de la camera, ça te donne le collider sur lequel est ta souris, et te donne la position dans le repère monde du point de contact.

Ton "icone" cercle+cône peut être considérée comme plane, il suffit de lui ajouter un planeCollider et un bout de script calculant la distance entre le contacte et le centre du GameObect.

Code : Tout sélectionner

public class FadeSound : MonoBehaviour {
	private float scale = 5.0f;
	public float ToFade;
	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);
		}
	}
}
essaye juste tu cré un 3d object plane, positionné bien visible a ta caméra, et tu lui met ce script. Par défaut un plane fait 10 de coté, d’où le scale à 5.0.
Ensuite libre a toi d'utiliser la variable ToFade pour contrôler le volume de la source audio par exemple

Re: Mouse audio listener?

Publié : 20 Nov 2018 19:22
par boubouk50
La spatialisation dépend de la distance entre le listener et l'audiosource.
L'idée derrière le Raycast est de trouver la profondeur, ce que ne fais pas le ScreenToWorld.
Tu es dans un jeu 3D, mais dans ton idée de jeu isométrique, tu as une vision 2D. Dans ce cas, il va falloir travailler ta géométrie pour gérer cela de façon planaire. Du genre, les gameObjects cliquables ont un collider circulaire plan en billboard (donc toujours face à la caméra) pour simuler un collider 2D.
Cela pourrait, là je ne m'avance pas, être simuler en 2D par dessus le monde 3D. Mais c'est un peu plus copieux à mettre ne place tout de même.

Re: Mouse audio listener?

Publié : 21 Nov 2018 16:17
par 1300vrtical
Bonjour et merci pour toutes ces informations :amen: ,
Je comprends effectivement que je recherchais à faire de la 3D alors que visuellement mon projet est en 2D. En utilisant 3D sound j'avais aussi un problème de spatialisation gauche-droite du son que je ne savais pas encore comment gérer. Je ne savais pas que je pouvais utiliser Raycast de cette manière. Les tutos que je trouve reste sensiblement les mêmes et c'est pour ça que je me tourne vers les forums.
Je suis une bille en programmation :happy1: . J'arrive à les lire à peu près à les comprendre, mais pas en écrire. Du coup je n'arrive pas à sortir la valeur ToFade pour la soustraire au volume, car elle serait non statique :| . J'y arrive pas dès lors qu'il fait sortir autre chose des fonctions Debug... :gene:

merci à ceux qui m'aide et m'aiderons.

Ps: je ne sais pas quoi échanger contre un peu d'aide sur ce j'ai des compétences en graphisme et 3D si ça interesse quelqu'un.

Re: Mouse audio listener?

Publié : 21 Nov 2018 16:33
par djulio74
Tu utilisait ta souris comme audioListener,
utilise plutot la camera pour le listener, et avec un audio source par GameObject censé produire un son, auxquels tu désactive le 3dSound, laisse le "play on awake" activé mais défini le volume a zéro.

Dans mon script, que tu attache à chaque objet sonore, tu ajoute une void Start dans laquelle tu recupere le Component audioSource du Gameobject. Du coup dans la void OnMouseOver tu ajoute a la fin un MyAudioSource.volume = ToFade; par exemple.

tu peux aussi ajouter une void OnMouseExit pour bien mettre le volume a 0 dès que ta souris ne survole plus l'objet.

Regarde un peu tout ça, et si vraiment tu n'y arrive pas je te ferais un petit script d'exemple. ;-)