Jump to content
Unity Insider Forum

If in Update nur einmal ausführen


Hämmer

Recommended Posts

Hallo, ich hab da folgendes Problem.

Ich möchte etwas alle 10 Sekunden tun und habe aus diesem Grund folgende If-Abfrage geschrieben und diese in die Update Methode gelegt.
die If Abfrage soll aber halt nur EINMAL alle 10 Sekunden was ausgeben. Bei mir gibt diese aber mehrmals was aus.

Vielleicht könnt ihr mir das erklären?! 

mein Script:

    void Update()
    {
        if (Math.Truncate(Time.time) % 10 == 0 && i)
        {
            i = false;
            print(Math.Truncate(Time.time) + " (" + Time.time + ")");
        }
        else
        {
            i = true;
        }
    }

Ausgabe:

image.png.bf9613155505013cb674dc36c7028236.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist die Logik dahinter. :)
Wenn du 2 Sachen zusammen abfragst, dann ist das ja ein logisches UND.
Also nur wenn das Eine UND das Andere wahr ist, dann mache etwas.

Soweit so gut.

Aber du nutzt else und dort wird etwas ausgeführt, wenn eins der beiden Dinge in der Abfrage nicht wahr ist. Dummerweise setzt du aber eins der beiden Dinge dann auf wahr.

In deiner Abfrage rundest du mit dem Befehl Truncate die Zahl in Richtung 0, also so ähnlich wie mit Floor. Aus der 10,xx  wird die 10. Aus 0,xx wird die 0.
Dann willst du mit dem Modulo Befehl den ganzzahligen Rest dieser Zahl ermitteln, wenn du sie durch 10 teilst.

Da Modulo nichts anderes ist als : a -(a/b) * b  kommt bei der Time= 0,xx eben auch ein Rest von 0 raus, denn 0- (0/10) *10 ist 0. Und bei 10-(10/10)*10 , was ja 10 - 1*10 entspricht, ist auch 0.
Das ist schon mal der Grund, warum es nicht nur bei der 10 passiert.
Und es passiert mehrmals bei der 0 und der 10, weil du zwar  i auf false setzt, sobald die Bedingung wahr ist. Aber im nächsten Durchlauf, wegen dem i nicht wahr ist und somit else greift.
Das else setzt das i wieder auf true und somit ins im darauf folgenden Durchlauf wieder die Bedingung für deine Abfrage erfüllt.
Solange bei deinem Truncate also eine 10 oder eine 0 raus kommt, wirst du alle 2 Durchläufe einen Ausdruck bekommen.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb malzbie:

Das ist die Logik dahinter. :)
Wenn du 2 Sachen zusammen abfragst, dann ist das ja ein logisches UND.
Also nur wenn das Eine UND das Andere wahr ist, dann mache etwas.

Soweit so gut.

Aber du nutzt else und dort wird etwas ausgeführt, wenn eins der beiden Dinge in der Abfrage nicht wahr ist. Dummerweise setzt du aber eins der beiden Dinge dann auf wahr.

In deiner Abfrage rundest du mit dem Befehl Truncate die Zahl in Richtung 0, also so ähnlich wie mit Floor. Aus der 10,xx  wird die 10. Aus 0,xx wird die 0.
Dann willst du mit dem Modulo Befehl den ganzzahligen Rest dieser Zahl ermitteln, wenn du sie durch 10 teilst.

Da Modulo nichts anderes ist als : a -(a/b) * b  kommt bei der Time= 0,xx eben auch ein Rest von 0 raus, denn 0- (0/10) *10 ist 0. Und bei 10-(10/10)*10 , was ja 10 - 1*10 entspricht, ist auch 0.
Das ist schon mal der Grund, warum es nicht nur bei der 10 passiert.
Und es passiert mehrmals bei der 0 und der 10, weil du zwar  i auf false setzt, sobald die Bedingung wahr ist. Aber im nächsten Durchlauf, wegen dem i nicht wahr ist und somit else greift.
Das else setzt das i wieder auf true und somit ins im darauf folgenden Durchlauf wieder die Bedingung für deine Abfrage erfüllt.
Solange bei deinem Truncate also eine 10 oder eine 0 raus kommt, wirst du alle 2 Durchläufe einen Ausdruck bekommen.

 

Sehr schön erklärt das verstehe selbst ich als voll Anfänger ^^ 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...