Jump to content
gante juega

Sonidos de pasos

Recommended Posts

Hola a todos,  tengo un problema y no encuentro solución, o al menos no una total, si arreglo el audio de los pasos se me descompone el audio de los saltos y viceversa jaja la cosa es que tengo el script para el movimiento del personaje, camina, salta y todo bien por ese lado, mi problema es cuando le intento poner el audio a la animación de caminar la de salto no se reproduce o cuando se reproduce la de salto, el de los pasos solo se escucha una vez y no continuo. 

El audio lo he añadido al hacer colisión con un tag, por que quiero meter diferentes sonidos según en el tag que se este caminando, además de que a la hora que cae pues se escucha que cae en pasto.

Si activo el loop el sonido de salto se reproduce en loop y no cada vez que se pulsa la tecla "espacio"

 

añado el código, así el audio solo se reproduce cuando cae después del salto, y no mientras se mantiene presionada la tecla de caminar

 

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

public class player : MonoBehaviour
{

  // Audio Salto

  public AudioClip saltoAudio;
  AudioSource fuenteSaltoAudio; 


  // Audio Pasos

  public AudioClip pasosAudio;
  AudioSource fuentePasosAudio; 


  // VELOCIDAD CAMINAR
  float velocidadX;


  //Salto
  private Animator animator; 
  private float fuerzaSalto=6f;
  int saltosHechos;
  int limiteSaltos=2;


  private Rigidbody2D rb;

    // Start is called before the first frame update
    void Start()
    {


      //Salto 
      animator= GetComponent<Animator>();
      rb = GetComponent<Rigidbody2D>();
      saltosHechos=0;


      // Audio Salto

      fuenteSaltoAudio=GetComponent<AudioSource>();
      fuentePasosAudio=GetComponent<AudioSource>();

    }

    // Script para correr > descanso > correr
    void Update()
    {





        velocidadX=0f;
        if (Input.GetKey(KeyCode.D)){


        if (GetComponent<SpriteRenderer>().flipX==true){
            GetComponent<SpriteRenderer>().flipX = false;


          }
          GetComponent<Animator>().SetBool ("correr",true);
          velocidadX=3f;
        }




        if (Input.GetKey(KeyCode.A)){




          if (GetComponent<SpriteRenderer>().flipX==false){
            GetComponent<SpriteRenderer>().flipX = true;
          }
          GetComponent<Animator>().SetBool ("correr",true);
          velocidadX=-3f;

        }



        transform.Translate(velocidadX*Time.deltaTime,0f,0f);


      if (velocidadX==0f){
        GetComponent<Animator>().SetBool ("correr",false);
    }




    //Salto

      if(Input.GetKeyDown(KeyCode.Space))
      {
        if(saltosHechos<limiteSaltos) {

        // Audio Saltar
        fuenteSaltoAudio.clip=saltoAudio;
        fuenteSaltoAudio.Play ();

        animator.SetBool("saltar", true);
        rb.AddForce(new Vector2(0f,fuerzaSalto),ForceMode2D.Impulse);
        saltosHechos++;
    }

      }





    }


    //Elimina animación saltar
     private void OnCollisionEnter2D(Collision2D collision)
      {
        if (collision.gameObject.tag == "Suelo")
        {
          saltosHechos=0;   
          animator.SetBool("saltar", false);

        fuentePasosAudio.clip=pasosAudio;
        fuentePasosAudio.Play ();
    }


}
        


}

Actualización

he encontrado una solución a medias, no se si sea la mejor manera pero funciona, lo que he hecho es crear un objeto el cual he llamado pies, le he añadido un audio source y un script, ahora si se escucha mientras se mantiene presionada la tecla, pero no detecta la colisión con el suelo, esto hace que en el salto si aprietas la "D" se siga reproduciendo el audio de caminar mientras estas en el aire, además si no me detecta la colisión no sonara diferente con los diferentes tags "pasto", "metal", "concreto" etc...

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

public class pies : MonoBehaviour
{


  private AudioSource audioSource; 



    // Start is called before the first frame update
    void Start()
    {
              audioSource=GetComponent<AudioSource>();

    }

    // Update is called once per frame
    void Update()
    {


     	if (Input.GetKeyDown(KeyCode.D)){
    	audioSource.UnPause();
		}

		if(Input.GetKeyUp(KeyCode.D)){
			audioSource.Pause();
		}


   		if (Input.GetKeyDown(KeyCode.A)){
    	audioSource.Play();
		}

		if(Input.GetKeyUp(KeyCode.A)){
			audioSource.Pause();
		}

  
    }
}

he intentado con 

private void OnCollisionEnter2D(Collision2D collision)
      {
        if (collision.gameObject.tag == "Suelo")
        {

 

pero no surge efecto

Edited by gante juega

Share this post


Link to post
Share on other sites

Hola!

Creo que el problema lo tienes con:

fuenteSaltoAudio=GetComponent<AudioSource>();
fuentePasosAudio=GetComponent<AudioSource>();

Al hacer GetComponent estás obteniendo el primer componente, por lo tanto fuenteSaltoAudio y fuentePasosAudio es el mismo componente, con lo que al reproducir un sonido estás pisando al otro.
Una solución rápida es utilizar GetComponents<AudioSource>(), esto te devolverá un array con todos los componentes de ese tipo y puedes asignar el primero a una variable y el segundo a otra.

Un saludo!

Share this post


Link to post
Share on other sites

×
×
  • Create New...