Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Sonido 2D que se escucha más fuerte al acercarte..

Iniciado por Bydark, Febrero 09, 2018, 03:11:14 PM

Tema anterior - Siguiente tema
Pues el título lo dice todo, la verdad es que no sé como lograr esto en 2d, quiero que haya X objetos que siempre estén sonando pero que se escuchen más fuerte o más flojo a medida que el player se aleje o acerque.
 


Esto se hacerlo en 3D, pero no doy con la tecla para hacerlo en 2D, alguna idea??
 
 
 
Muchas gracias!!!

yo lo haria añadirndo un pequeño script a cada "objeto que suena"...
 

public class VolumeByDistance : monoBehaviour o comosea...
   private Transform player;
   private AudioSouce _audio;
   private float maxDist = 10.0f;//a partir de esa distancia deja de disminuir el volumen....   
   private float minVol = 0.25f;//volumen minino al que suena cuando esta muy lejos
 
   void Start() {
      _audio = GetComponent<AudioSource>();
      player = GameObject.Find("Player");//el nombre que tenga...
   }
       
   void Update() {
        float dist = Vector3.Distance(player.position, transform.position);
        dist /= maxDist;
        if (dist>1f) {
           dist = 1f;
        }
        dist *= (1-minVol);
        dist += minVol;
        _audio.volume = dist;
   }

 
esta sin testear (escrito desde el movil) 
 
...pero creo que funcionara...

Cita de: Igor date=1518191853yo lo haria añadirndo un pequeño script a cada "objeto que suena"...
   
   

public class VolumeByDistance : monoBehaviour o comosea...
   private Transform player;
   private AudioSouce _audio;
   private float maxDist = 10.0f;//a partir de esa distancia deja de disminuir el volumen....   
   private float minVol = 0.25f;//volumen minino al que suena cuando esta muy lejos
 
   void Start() {
      _audio = GetComponent<AudioSource>();
      player = GameObject.Find("Player");//el nombre que tenga...
   }
       
   void Update() {
        float dist = Vector3.Distance(player.position, transform.position);
        dist /= maxDist;
        if (dist>1f) {
           dist = 1f;
        }
        dist *= (1-minVol);
        dist += minVol;
        _audio.volume = dist;
   }

   
      esta sin testear (escrito desde el movil) 
   
   
      ...pero creo que funcionara...
   


Muchas gracias, he agregado el script al objeto que quiero que tenga sonido, pero no me queda claro como decirle que archivo de audio tiene que escoger...
 
 
 
Muchas gracias de nuevo.

Cita de: Bydark date=1518214275pero no me queda claro como decirle que archivo de audio tiene que escoger...
   


eso lo hacés vos mismo asignando el Audioclip en el AudioSource de cada fuente, o si quisieras hacerlo dinamicamente accediendo al campo "clip" (o audioClip, no recuerdo)

Febrero 09, 2018, 11:40:35 PM #4 Ultima modificación: Febrero 09, 2018, 11:45:38 PM por pioj
No hay manera, me salta este error:
 



   
      Assets/Scripts/volumenacercarse.cs(16,23): error CS0029: Cannot implicitly convert type `UnityEngine.GameObject' to `UnityEngine.Transform'
   

[/quote]
 
De todas formas sigo sin poder adjuntar mi sonido, no se crea el espacio para adjuntarlo.

Le tratas de pasar un GameObject en lugar de su componente Transform. Te lo está diciendo...

Febrero 09, 2018, 11:46:16 PM #6 Ultima modificación: Febrero 09, 2018, 11:46:36 PM por lightbug
Cita de: Bydark date=1518216035No hay manera, me salta este error:
   
   
       
   
   
       
   
   
      Assets/Scripts/volumenacercarse.cs(16,23): error CS0029: Cannot implicitly convert type `UnityEngine.GameObject' to `UnityEngine.Transform'
   
   
       
   
   
      De todas formas sigo sin poder adjuntar mi sonido, no se crea el espacio para adjuntarlo.
   


Lee bien el error estás asignando un GameObject a un Transform, eso es porque en el Find que te pasaron se devuelve un GameObject, y Player es un transform, con solo hacer
 

pLayer = GameObject.Find("Player").transform;

 
 

Febrero 11, 2018, 02:54:43 AM #7 Ultima modificación: Febrero 11, 2018, 02:55:05 AM por Bydark
Muchas gracias por contestar, al final logré que funcionara con vuestra ayuda.
 
 
 
Pero me surge una última duda, ¿Como puedo parar ese sonido al chocar con un collider? Imagino que sería algo del tipo...
 

void OnTriggerEnter2D(Collider2D col){
        if (col.gameObject.tag == "player") {
                     GetComponent<AudioSource>()........ // AQUÍ ES DONDE ME PIERDO
 
        }
}

 
 
 
Como véis, no tengo nada claro con qué comando le ordeno que el sonido entre en "stop" .
 
 
 
Muchísimas gracias a esta fantástica comunidad.

Cita de: Bydark date=1518314083Como véis, no tengo nada claro con qué comando le ordeno que el sonido entre en "stop" .
   


https://docs.unity3d.com/ScriptReference/AudioSource.html
 
FIjate en la parte de métodos públicos, hay uno que hace obviamente lo que buscás

Febrero 11, 2018, 08:22:09 AM #9 Ultima modificación: Febrero 11, 2018, 08:22:30 AM por brok

private AudioSource audioSource;
 
private void Start()
{
audioSource = GetComponent<AudioSource>();
     
}
 
private void OnTriggerEnter2D(Collider2D col)
{
      if (col.tag == "player")
      {
             audioSource.Play();
                     
      }
      else
      {
      audioSource.Stop();
      }
}

 
Espero te sirva

Febrero 11, 2018, 07:55:18 PM #10 Ultima modificación: Febrero 11, 2018, 07:57:48 PM por Bydark
Muchas gracias a los dos, al final dejé el código así: 
 
 
 

AudioSource m_MyAudioSource;
 
private void Start(){

   m_MyAudioSource = GetComponent<AudioSource>();


}
 

void OnTriggerEnter2D(Collider2D col){
   if (col.gameObject.tag == "path") {
      Debug.Log ("Se tocan");
      this.transform.GetComponent<SpriteRenderer>().enabled = true; // Activa el renderizado del objeto que has tocado.
 
      m_MyAudioSource.Stop(); // El audiosource se pone en stop.
 
 
   }
}
 
Espero que a alguien más le sirva.

 
 
 
 
 
EDITO: Me surge otra pregunta, ¿Y si el objeto tiene varios AudioSource, cómo accedo a uno u otro?

Cita de: Bydark date=1518375318¿Y si el objeto tiene varios AudioSource, cómo accedo a uno u otro?
   


Me parece que en vez de definir un audioSource podés tener un arreglo y hacer GetComponents<AudioSource>() ? no estoy seguro, investigalo, casi nunca lo usé pero creo recordar que te devuelve todos los componentes de ese tipo. La otra es tener los campos serializados (o mas facil, los haces public) y desde el editor vas arrastrando directamente el audioSource al "casillero".

Cita de: lightbug date=1518379138Me parece que en vez de definir un audioSource podés tener un arreglo y hacer GetComponents<AudioSource>() ? no estoy seguro, investigalo, casi nunca lo usé pero creo recordar que te devuelve todos los componentes de ese tipo. La otra es tener los campos serializados (o mas facil, los haces public) y desde el editor vas arrastrando directamente el audioSource al "casillero".
   


Así funciona correctamente:
 
 
 

   bool touched = true;         //Esta variable se encarga de averiguar si ha habido contacto
AudioSource touchplatformsound; //Sonido al tocar una plataforma
AudioSource pathsound;          //Sonido que indica como llegar a la plataforma
private void Start(){

   AudioSource[] audio = GetComponents<AudioSource>();
   pathsound = audio[0];               
   touchplatformsound = audio[1];
 

}
 

void OnTriggerEnter2D(Collider2D col){
   if (col.gameObject.tag == "path") {
 
      Debug.Log ("Se tocan");
 
      this.transform.GetComponent<SpriteRenderer>().enabled = true; //Renderizado de la plataforma al tocarlo
      if (touched == true) {
      
      
         pathsound.Play();
         touched = false;
      
      }
 

      touchplatformsound.Stop();
 

   }
}

 
 
 
GRACIAS A TODOS!

Etiquetas: