Foros - Stratos

Programadores => Programación de audio => Mensaje iniciado por: juanchini220 en 23 de Diciembre de 2014, 01:15:26 AM

Título: Problema con efectos de sonido (OnTriggerStay) Unity3D (Solucionado)
Publicado por: juanchini220 en 23 de Diciembre de 2014, 01:15:26 AM
Hola amigos de Stratos:

Estoy con un proyecto en el que necesito hacer que una puerta tirada por cadenas reproduzca varios sonidos.

-El primer sonido es cuando estoy dentro de un trigger (que es cuando la puerta se abre añadiendo fuerza al rigidbody de la misma).
-El segundo es cuando salgo del trigger (que es cuando la puerta cae por su propio peso).
-Y el tercero es cuando la puerta cae y golpea el suelo.

La puerta se levanta cuando estoy dentro de un trigger y estos son  los script involucrados:
using UnityEngine;
using System.Collections;

public class TriggerActivadorPuno : MonoBehaviour {

    public bool toca;
    public PunoFuerza scriptPuno;
   
    void Start (){
   

    }
   
    void OnTriggerStay (Collider infotrigger){
        if (infotrigger.transform.tag == "PlayerAzul"){
            toca = true;
            scriptPuno.activado = true;
            }
    }

    void OnTriggerExit (Collider infotrigger){

        if (infotrigger.transform.tag == "PlayerAzul"){

            toca = false;
            scriptPuno.activado = false;
        }
    }
   



Y este es el otro:
using UnityEngine;
using System.Collections;

public class PunoFuerza : MonoBehaviour {

    public bool activado;
    public float fuerza;

    // Use this for initialization
    void Start () {
   
    }
   
    // Update is called once per frame
    void FixedUpdate () {
        if (activado){
            rigidbody.AddForce(0,fuerza,0);

        }
    }
}

Luego tengo otro script que se comunica con la cámara cuando choca con el suelo así se reproduce una animación en la que tiembla la cámara:
using UnityEngine;
using System.Collections;

public class TriggerGolpeCamara : MonoBehaviour {

    public bool temblar;
    public float tiempo;

    void Start (){


       
    }
   
    void OnTriggerEnter (Collider infotrigger){
        if (infotrigger.transform.tag == "Golpe"){
            temblar = true;


        }
    }
   


    void Update (){
        if (temblar){
            tiempo = tiempo + 1f*Time.deltaTime;
           
            if(tiempo >= 0.5f){
                temblar = false;
                tiempo = 0;
            }
        }

    }
   
}

Y este es el de la cámara:
using UnityEngine;
using System.Collections;

public class ControlTemblar : MonoBehaviour {
    public TemblarCamaraEvento scriptTembalarEvento;
    public TriggerGolpeCamara scriptTriggerGolpeCamara;
    public bool activar;
    public float tiempo;
    // Use this for initialization
    void Start () {
   
    }
   
    // Update is called once per frame
    void Update () {
   
        if (scriptTembalarEvento.temblar || scriptTriggerGolpeCamara.temblar){

            activar = true;
            tiempo = tiempo + 1*Time.deltaTime;
        }

        if (tiempo >= 0.5f){

            activar = false;
            tiempo = 0f;
        }
        gameObject.GetComponent<Animator>().SetBool("Activar", activar );

    }
}

El problema viene ahora..

He intentado hacer que cuando la fuerza este activada se reproduzca un sonido en otro gameobject (dado que quiero que el sonido se detenga cuando el otro esta reproduciendo)  y lo mismo al estar desactivada. Y lo único que me funciona, y mal, es el sonido del golpe que se reproduce usando el bool temblar del script TriggerGolpeCamara.
Este es el script (No me maten por favor!):
using UnityEngine;
using System.Collections;

public class PunoControlSonidos : MonoBehaviour {
    public GameObject bajadaSonido;
    public GameObject subidaSonido;
    public GameObject golpeSonido;

    public PunoFuerza scriptPunoFuerza;
    public TriggerGolpeCamara scriptTriggerGolpeCamara;

    public bool subiendo;
    public bool golpeando;
    public bool bajando;


    // Use this for initialization
    void Start () {
   
    }
   
    // Update is called once per frame
    void Update () {
   
        if(scriptPunoFuerza.activado ){
            subiendo = true;



        }
        if(!scriptPunoFuerza.activado && !scriptTriggerGolpeCamara.temblar){
            bajando = true;

        }

        if(scriptTriggerGolpeCamara.temblar){
            golpeando = true;

        }




        if(subiendo){
            subidaSonido.GetComponent<AudioSource>().audio.Play();
            bajadaSonido.GetComponent<AudioSource>().audio.Stop();
            subiendo = false;
            print ("estoy Subiendo");
        }

        if (bajando && !subiendo && !golpeando){
            bajadaSonido.GetComponent<AudioSource>().audio.Play();
            subidaSonido.GetComponent<AudioSource>().audio.Stop();
            bajando = false;
            print ("estoy Bajando");
        }

        if (golpeando){
            golpeSonido.GetComponent<AudioSource>().audio.Play();
            bajadaSonido.GetComponent<AudioSource>().audio.Stop();
            golpeando = false;
            print ("he golpeado");

        }



    }
}

Espero que me haya explicado bien dado que estoy totalmente bloqueado en eso y no encuentro nada en google y ni hablar con la documentación de Unity.

Ya está solucionado!

El problema radicaba que al activar audio.play con un bool desde Update( )  hace que el sonido comience desde el principio cada ves que los frames se actualizan. 

La solución que conseguí fue esta:
using UnityEngine;
using System.Collections;

public class PunoControlSonidos : MonoBehaviour {
    public GameObject bajadaSonido;
    public GameObject subidaSonido;
    public GameObject golpeSonido;

    public PunoFuerza scriptPunoFuerza;
    public TriggerGolpeCamara scriptTriggerGolpeCamara;

    public bool tocaTecho;


    // Use this for initialization
    void Start () {
   
    }


    void OnTriggerEnter ( Collider infocollider  ) {

        if (infocollider.transform.name == "Techo"){
            tocaTecho = true;
        }
    }

    void OnTriggerrExit (Collider infocollider){
        if (infocollider.transform.name == "Techo"){
            tocaTecho = false;
        }
    }


    // Update is called once per frame
    void Update () {
   
        if(scriptPunoFuerza.activado && !subidaSonido.GetComponent<AudioSource>().audio.isPlaying && !tocaTecho){
            //subiendo = true;
            subidaSonido.GetComponent<AudioSource>().audio.Play();
            bajadaSonido.GetComponent<AudioSource>().audio.Stop();
            print ("estoy Subiendo");
        }

        if(!scriptPunoFuerza.activado && !bajadaSonido.GetComponent<AudioSource>().audio.isPlaying && !scriptTriggerGolpeCamara.abajo){
            //bajando = true;
            bajadaSonido.GetComponent<AudioSource>().audio.Play();
            subidaSonido.GetComponent<AudioSource>().audio.Stop();
            print ("estoy Bajando");
            tocaTecho = false;
        }

        if(scriptTriggerGolpeCamara.temblar && !golpeSonido.GetComponent<AudioSource>().audio.isPlaying){
            //golpeando = true;
            golpeSonido.GetComponent<AudioSource>().audio.Play();
            bajadaSonido.GetComponent<AudioSource>().audio.Stop();
            print ("he golpeado");

        }

        if (tocaTecho){

            subidaSonido.GetComponent<AudioSource>().audio.Stop();
        }


}

Espero que sea de ayuda para alguien!