ONeillsBude Geschrieben 29. Dezember 2016 Melden Share Geschrieben 29. Dezember 2016 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 More sharing options...
Sascha Geschrieben 29. Dezember 2016 Melden Share Geschrieben 29. Dezember 2016 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 More sharing options...
ONeillsBude Geschrieben 29. Dezember 2016 Autor Melden Share Geschrieben 29. Dezember 2016 OK, alles aus der Update Funktion rausnehmen? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 29. Dezember 2016 Melden Share Geschrieben 29. Dezember 2016 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 More sharing options...
ONeillsBude Geschrieben 29. Dezember 2016 Autor Melden Share Geschrieben 29. Dezember 2016 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 29. Dezember 2016 Melden Share Geschrieben 29. Dezember 2016 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 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 More sharing options...
malzbie Geschrieben 29. Dezember 2016 Melden Share Geschrieben 29. Dezember 2016 Mir ist schon klar, dass ich alles in der Methode machen kann, in die ich beim Druck auf nen UI Button oder einem anderen Event rein springe und dann keine Update brauche. ^^ Ich ändere das muss mal in kannst ab, wenn's recht ist! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 29. Dezember 2016 Melden Share Geschrieben 29. Dezember 2016 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 More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.