2013-10-08 9 views
5

Wir wissen, es gibt eine "Regel", dass Input Funktionen nicht innerhalb der FixedUpdate() verwendet werden sollten; Input.GetKeyDown() funktioniert möglicherweise nicht, wenn wir dies tun, aber ist es wirklich falsch, Input.GetKey() zu verwenden?Ist es wirklich falsch, Input.GetKey() auf FixedUpdate zu verwenden?

Angenommen, wir möchten etwas auslösen, wenn Sie eine Taste gedrückt halten, die nicht von der Hardwareleistung abhängig ist. Ich möchte keine Logik erstellen, um dies unter Verwendung von Delta-Zeit oder Schreiben Schlüsselerkennungscode in Update und Eröffnungscode in FixedUpdate zu steuern.

Macht es keinen Sinn, einfach alles innerhalb FixedUpdate zu tun? Was passieren kann - wir könnten einige wichtige Ereignisse verlieren, die wir sowieso nicht wollten, um unsere gewünschte Rate zu halten.

Aber was passiert, wenn ein einzelnes Schlüsselereignis eintritt, können wir es verlieren? Gibt es einen Reset nach Update, so werden wir es nicht auf FixedUpdate sehen?

Antwort

8

Von der GetKeyDowndocs:

Sie benötigen diese Funktion von der Update-Funktion aufzurufen, da der Zustand jedes Bild wird zurückgesetzt

Also ja, ist der Eingangszustand jeden Frame zurückgesetzt Die Bedeutung der Hardware hängt davon ab, wie häufig Update zwischen FixedUpdate ausgelöst wird.

Es gibt wirklich keine einfache Möglichkeit, eine Kopie der von FixedUpdate verwendeten Eingabe zu vermeiden, obwohl ich vorschlagen würde, Ihre Logik neu zu bewerten, um Dinge in Update zu verschieben.

Update:

In Bezug auf unter Rutter Kommentar. Ich bemerkte gerade das OP fragte nach GetKey(), was ich schrieb über GetKeyDown() bleibt wahr für GetKey(), obwohl die Dokumentation nicht ausdrücklich so sagt.

Dies kann verifiziert werden, indem Sie in die Time Manager gehen und die FixedUpdate Rate auf ein langes Intervall wie 1 Sekunde ändern. Dann tun Sie so etwas wie:

void FixedUpdate() { 
    if(Input.GetKey(KeyCode.D)){ 
     Debug.Log("D-Key Down"); 
    } else { 
     Debug.Log("No key down"); 
    } 
} 

Wenn Sie drücken und loslassen ‚D‘ zwischen den 1 Sekunde festen Rahmen werden Sie nur „No Key Down“ sehen.

+0

Absolut zutreffend für 'GetKeyDown()', aber nach meiner Erfahrung 'GetKey() 'war in Ordnung. Hat sich das in den letzten paar Versionen geändert? – rutter

+3

@Rutter Danke für den Hinweis, dass ich die falsche Funktion adressiert habe, siehe mein Update. Ich vermute, dass es nicht etwas ist, was Sie mit der festen Standardrate von 0,02s bemerken würden, da "GetKey" für fortlaufende Tastendrücke ist. – Jerdak

+0

Vielen Dank, das ist ein gutes Experiment, um zu beweisen, dass GetKey() jedes Frame zurückgesetzt wird, auch wenn dies nicht explizit in der Dokumentation steht. – Roberto

2

Meiner Erfahrung nach erfolgt die Aktualisierung zur Frame-Zeit, im Gegensatz zu Fixed Update, das mehrmals pro Frame auftreten kann. Außerdem wird die Physik der Objekte tatsächlich aktualisiert, bevor FixedUpdate() aufgerufen wird, was bedeutet, dass es aufgrund der Komplexität der Szene zu einer Verzögerung kommen kann.

Ich glaube, dass Input pro Frame tatsächlich gesendet wird, wenn die FixedUpdate() also hinter ist und durch mehrfaches Feuern aufholen muss, schlägt die Eingabeüberprüfung fehl.

Weitere Ressourcen:

http://answers.unity3d.com/questions/10993/whats-the-difference-between-update-and-fixedupdat.html

+0

Nach dem Flussdiagramm http://docs.unity3d.com/uploads/Main/monobehaviour_flowchart.svg Ich denke, FixedUpdate() heißt "vor" der Physik aktualisieren? –

0

Der Grund, warum Sie nicht Eingang in FixedUpdate verwenden sollten, weil Eingang durch das Betriebssystem ausgeführt wird.Das Update ist auf das Betriebssystem ausgerichtet, nicht jedoch auf das FixedUpdate.

Wenn Sie Input in FixedUpdate verwenden, können Sie daher Eingaben verpassen.

Zum Beispiel, wenn Sie 100fps laufen, aber FixedUpdate ist 50fps:

f0 f1 f2 f3 f4 
FU   FU   FU 
U U  U  U  U 
    I  

ich für den Rahmen steht, wenn das Betriebssystem die Eingabe in die Software berichtet. Update erfasst die Informationen und verwendet sie. Am Ende von f1 wird die Eingabe vom OS zurückgesetzt.

Wenn Sie die Eingabe in FixedUpdate abgefangen hätten, hätten Sie sie verpasst, weil FixedUpdate nicht auf f1 ausgeführt wurde.

Verwandte Themen