2016-03-21 3 views
1

in meinem Projekt Ich möchte einen Sound zu spielen und dann für einen Objekte aktiven Zustand auf false gesetzt werden, im Moment sind beide zur gleichen Zeit passiert, so dass der Ton nicht spielt . Wenn ich den aktiven Zustand als wahr halte, höre ich das Klangspiel.Spielen und warten auf die Wiedergabe von Audio

Wie kann ich sicherstellen, dass das Audio endet, bevor der eingestellte aktive Zustand auf false geschaltet wird, ist jede Hilfe oder Rat gefragt.

Hier ist eine Auswahl meines Codes;

void OnTriggerEnter(Collider other) 
{ 
    if (other.tag == "Pick Up") 
    { 
     if (!isPlayed) { 
      source.Play(); 
      isPlayed = true; 
     } 
    } 
    if (other.gameObject.CompareTag ("Pick Up")) 
    { 
     other.gameObject.SetActive (true); 
     count = count + 1; 
     SetCountText(); 
    } 
} 
+0

Audioquelle hat ein 'isPlaying'-Feld, das Sie überprüfen können. Hast du das versucht? –

+1

Ja, es ist ein Fall, in dem man in einer Coroutine auf .isPlaying warten muss - genau wie mit Animationen. – Fattie

+1

@JoeBlow muss er das in einer Coroutine machen oder viel Bool auf der Update-Funktion haben. Coroutine ist der Weg, dies zu tun. – Programmer

Antwort

2

Verwenden Koroutine als Joe Said. Starten Sie Coroutine jedes Mal, wenn das kollidierte Objekt aktiviert ist.

void OnTriggerEnter(Collider other) 
{ 
    if (other.tag == "Pick Up") 
    { 
     if (!isPlayed) { 
      source.Play(); 
      isPlayed = true; 
     } 
    } 
    if (other.gameObject.CompareTag ("Pick Up")) 
    { 
     other.gameObject.SetActive (true); 
     count = count + 1; 
     SetCountText(); 
     StartCoroutine(waitForSound(other)); //Start Coroutine 
    } 
} 



IEnumerator waitForSound(Collider other) 
    { 
     //Wait Until Sound has finished playing 
     while (source.isPlaying) 
     { 
      yield return null; 
     } 

     //Auidio has finished playing, disable GameObject 
     other.gameObject.SetActive(false); 
    } 
3

Sie könnten das Objekt mit seiner renderer, sowie das Ausschalten alle Beschleunigern verstecken, den Ton spielen, dann zerstören/set es inaktiv:

renderer.enabled = false; 
gameObject.collider.enabled = false; 

audio.PlayOneShot(someAudioClip); 
Destroy(gameObject, someAudioClip.length); //wait until the audio has finished playing before destroying the gameobject 
// Or set it to inactive 
Verwandte Themen