Jump to content
Unity Insider Forum
Sign in to follow this  
Hämmer

If in Update nur einmal ausführen

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

Share this post


Link to post
Share on other sites

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.

 

  • Thanks 2

Share this post


Link to post
Share on other sites
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 ^^ 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×