Jump to content
Unity Insider Forum

Pro Sekunde Subtrahieren während Taste gedrückt


B.J

Recommended Posts

Hallo zusammen,

 

 

In einem einfachen Script habe ich eine Variable. Diese hat eine beliebige Grösse, zB 5. Wird nun die W Taste gedrückt und gehalten, so soll dieser Variablen pro Sekunde 1 abgezogen werden. WIe soll ich das machen? Eine Möglichkeit wäre herauszufinden, mit wie vielen Frames das Spiel gerade läuft und dann einfach alle X Frames eins abziehen...Vielleicht bietet Unity da aber auch gerade etwas passendes an.

(JS) Der Code:

if(Input.GetKey(KeyCode.W) ){

//Variable X -- pro Sekunde 	

}

 

Danke, LG B.J

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie immer, wenn WaitForSeconds mit while vorgeschlagen wird, muss ich protestieren :)

Diese Methode kann bei jedem Schleifendurchlauf bis zu einen Frame länger dauern als erwartet. Das kann sich läppern und zu hässichen Ergebnissen führen.

InvokeRepeating ginge, aber in meinen Augen ist die einfachste Variante, ein float statt einer Ganzzahl und Update zu benutzen.

Wenn man dann die Ganzzahl wissen will, rundet man einfach auf.

var x : float;

function Update()
{
 x -= Time.deltaTime;
}

function CurrentValue()
{
 return Mathf.CeilToInt(x);
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da seine Anforderung war jede Sekunde genau dann etwas abzuziehen halte ich WaitForSeconds und InvokeRepeating deiner Update Variante immer noch klar für überlegen.

 

while + WaitForSeconds halte ich da auch für nicht problematisch, es sei denn du kannst mir sagen was genau in diesem Fall für ein Problem auftaucht wenn die Aktion 1 Frame verspätet auftritt? Timing? Das wird auch mit Update nicht das wahre werden ;)

 

Und UnityScript Sascha? Schäm dich gefälligst :P

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da seine Anforderung war jede Sekunde genau dann etwas abzuziehen halte ich WaitForSeconds und InvokeRepeating deiner Update Variante immer noch klar für überlegen.

 

while + WaitForSeconds halte ich da auch für nicht problematisch, es sei denn du kannst mir sagen was genau in diesem Fall für ein Problem auftaucht wenn die Aktion 1 Frame verspätet auftritt? Timing? Das wird auch mit Update nicht das wahre werden ;)

Ich lasse mich gerne eines besseren belehren, aber soweit ich weiß, ist Time.deltaTime sehr präzise.

Lass' das Spiel mal eine halbe Stunde lang laufen, dann hast du 1800 WaitForSeconds. Bei 30 fps bedeutet das irgendetwas zwischen 0 und einer ganzen Minute Ungenauigkeit.

 

Es geht außerdem um's Prinzip; nur, weil der Schaden hier im Zweifelsfall vergleichbar gering wäre, heißt das nicht, dass die Idee nicht irgendwie schlecht ist. Darum rate ich grundsätzlich von Schleifen + WaitForseconds ab.

 

Und UnityScript Sascha? Schäm dich gefälligst :P

Hab mich nur an OP angepasst :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenns ums unpräzise geht dann lösen wir es doch einfach auf diese Art:

 

klickTime = CurrentTime;
...
result = (int)(CurrentTime - klickTime).TotalSeconds

 

Unter den Bedingungen die der OP gezeigt hat sehe ich aber kein Verlangen nach 100% Präzision, abgesehen davon ist Time.deltaTime FrameZeit abhängig und nicht Gametime, WaitForSeconds würde das berücksichtigen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Variante geht natürlich auch.

 

Unter den Bedingungen die der OP gezeigt hat sehe ich aber kein Verlangen nach 100% Präzision,

Solange vernünftige Präzision keinen wirklichen Mehraufwand bedeutet, warum nicht einfach präzise arbeiten?

 

abgesehen davon ist Time.deltaTime FrameZeit abhängig und nicht Gametime, WaitForSeconds würde das berücksichtigen.

Ich bin mir SEHR sicher, dass WaitForSeconds intern eine der UnityEngine.Time-Funktionen benutzt, von daher...

 

Inwiefern ist deltaTime jetzt nicht präzise? Man sollte daoch davon ausgehen, dass das intern einfach so aussieht:

now = GetTime();
deltaTime = now - last;
last = now;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich sagte deltaTime ist Framezeit abhängig und nicht Gametime abhängig (Time.scale spielt da mit rein).

 

Semantisch gesehen ist die Update Variante auch noch schwerer lesbar als die Alternativen im Bezug zu dem was der OP möchte. Vermutlich stört mich das am meisten an der Update Variante.

 

Übrigens sollten wir das mit der Genauigkeit nochmal genauer ausloten, jeden Frame einen Wert per floating Point Addition erhöhen vs 1x pro gefordertem Zeitintervall (1 Sekunde) eine integer Addition.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Time.scale spielt da mit rein

Ah, dass du das dameint meinst, war mir nicht klar. Danke für die Klarstellung :)

 

Semantisch gesehen ist die Update Variante auch noch schwerer lesbar als die Alternativen im Bezug zu dem was der OP möchte. Vermutlich stört mich das am meisten an der Update Variante.

Kann ich nicht verneinen. Und ich sag ja, InvokeRepeating sollte durchaus funktionieren.

 

Übrigens sollten wir das mit der Genauigkeit nochmal genauer ausloten, jeden Frame einen Wert per floating Point Addition erhöhen vs 1x pro gefordertem Zeitintervall (1 Sekunde) eine integer Addition.

Da stimme ich zu! Außerdem zum Vergleich die C#-Stopwatch mitlaufen lassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...