Jump to content
Unity Insider Forum

AudioSource soll gespielt werden wenn ein Wert 1 ist, spielt aber erst bei 2!


ONeillsBude

Recommended Posts

Hallo,

 

ich habe das Problem, wenn ich will das ein AudioSource gespielt werden soll, wenn der Wert "Text" auf 1 gesetzt wird, aber er spielt erst wenn der Wert 2 erreicht hat.

 

void Update ()
{
  if (Text == 0) {
TextBox.text = "Testtext";
  }
  if (Text == 1) {
Prolog01.Play ();
TextBox.text = "Der Text ist jetzt 1";
  }
if (Text == 2) {
// Stop Prolog01
// Play Prolog02
TextBox.text = "Text Nummer 2";
}
 }

 

Komischerweise wird der TextBox-Text richtig angezeigt.

Waran kann es liegen das das AudioSource erst bei "2" abgespielt wird?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich brauche das Video nicht einmal anzusehen :)

 

Update wird jeden Frame aufgerufen. Das heißt, dass in jedem Frame, in dem Text == 1 ist, Prolog1 abgespielt wird. Wenn du AudioSource.Play() sagst, während die AudioSource schon spielt, dann wird unterbrochen und von vorne gespielt - wie bei einem MediaPlayer, bei dem du sechzig Mal in der Sekunde eine neue Datei öffnest. Da wird nichts zu hören sein.

Erst, wenn Text == 2 ist, lässt du Prolog1 "endlich in Ruhe" und es kann ungestört abspielen, ohne dass es jeden Frame unterbrochen und neu gestartet wird.

 

Du setzt ja Text an irgendeiner Stelle auf 1. Diese Stelle ist es auch, an der du Prolog1.Play() ausführen willst. Einen Wert zu setzen und dann in Update in Abhängigkeit von diesem Wert irgendetwas auszuführen ist nicht nur unnötig doppelt gemoppelt, es führt auch zu solcherlei Problemen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du musst kannnst natürlich schon die Update nutzen. Dir muss nur klar sein, dass die Update wirklich jedes Frame ausgeführt wird und wenn du über eine einzige Bedingung den Ton startest und diese Bedingung jedes Frame ansteht, dann wird auch ständig der Ton gestartet.

Also musst du diese Bedingung entweder sofort nach dem Nutzen wieder zurückstellen oder aber eine 2te Bedingung einfügen und das Ganze so ändern, dass beide Bedingungen nötig sind einen Ton abzuspielen. Die 2te Bedingung könntest du dann gleich beim Start des Tons ändern.

So etwa:

 

int prologNumber =0;

void Update(){
  if (Text==1 && prologNumber==0){
  prolog01.Play();
  TextBox.text=" das ist der Text 1";
  prologNumber=1;  // nachdem diese Variable auf 1 gesetzt wurde kann der Sound nicht nochmal gestartet werden
  }

}

 

Edit: Da du ja schreibst, dass der Ton erst ab dem Wert 2 zu hören ist, gehe ich davon aus, dass du zu Beginn des Soundfiles etwas Stille hast, die du natürlich nicht hörst. Trotzdem wurde das File ständig gestartet und hat auch immer ein paar Millisekunden gespielt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Alles klar, habs jetzt.

 

Hatte angefangen ne eigene Funktion für den Sound zu machen und dann mit dem Buttonklick diese Funktion dann aufzurufen nachdem "Text" um 1 herhöht wurde, so das nur mit beim Klick geupdatet wird.

Das machst du bitte auch :D

 

Du musst natürlich schon die Update nutzen.

Da würde ich nämlich widersprechen. Dieses Pattern:

public void StartPrologue()
{
 prologue = true;
}

void Update()
{
 if(prologue)
 {
   audio.Play();
 }
}

Ist ganz fürchterlich. Richtig wäre einfach nur:

public void StartPrologue()
{
 audio.Play();
}

und wie man sieht, wird da kein Update benutzt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist schon besser :)

 

Aber ich find's wichtig, darauf hinzuweisen, dass Reaktionen auf Dinge in Update auszuführen grundsätzlich ganz schlecht ist. Man sollte keinesfalls eine Art Event-Bus bauen, der über unnötige Variablen wartet, bis Update alles ausführt (oder eben auch nicht) und danach die Variable wieder umgeschrieben wird.

 

Sowas wie

public void StartPrologue()
{
 prologue = true;
}
void Update()
{
 if(prologue)
 {
audio.Play();
prologue = false;
 }
}

ist auf einem Level mit

while(stuff)
{
 Stuff();
 stuff = false;
}

...nur eben um eine Ecke rum. Und da erkennt man schnell, dass das ziemlich unsauber ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...