Jump to content
Unity Insider Forum

Zeitsteuerung / feste Dauer


Reggie()

Recommended Posts

Das mag jetzt echt eine blöde Frage sein, aber wie kann ich Abläufe in einer von mir gewünschten Dauer ablaufen lassen?

Beispiel: Ich möchte ein GameObject von Position A zu Position B verschieben in genau X Sekunden bzw. Dauer = Entfernung * Geschwindigkeit. 

Mache ich das mit Coroutines und pausen mittels yield? oder in Update mit pausen? Ich stehe da grad auf dem Schlauch....

Link zu diesem Kommentar
Auf anderen Seiten teilen

du meinst mit InvokeRepeating? Ja, das hatte ich auch schon bei meinen Recherchen entdeckt, war mir aber nicht sicher, ob das die richtige Methode für mein Anliegen ist.

FixedUpdate wird doch 1x pro Frame ausgeführt? und die Frames sind einstellbar? zB 50? also wenn ich etwas mit einer Dauer von 2 Sekunden erledigt haben will, dann mache ich in der FixedUpdate einen 100stel Teilschritt und nach 2 sekunden ist es fertig. so?

oder per coroutine und in der Schleife kann ich dann mit yield return waitforsecs() die genaue Wartezeit zwischen jedem Zwischenschritt bestimmen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, habe ich falsch verstanden.

FixedUpdate wird normal für Physik berechnungen verwendet. Ich meine man kann es einstellen in der Physik wie oft es abgefragt wird.
Fixed Update wird nicht einmal pro Frame ausgeführt. Das macht die normale Update Methode. Fixed Update ist laut Dokumentation 50x pro Sekunde.

Mit Coroutines kenne ich mich leider nicht aus.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 6 Stunden schrieb Reggie():

Mache ich das mit Coroutines und pausen mittels yield? oder in Update mit pausen? Ich stehe da grad auf dem Schlauch....

Ja und ja. Je nachdem, wie es sich anbietet. Wenn der Ablauf einen festen Start und ein festes Ende hat, ist eine Coroutine immer prima.

InvokeRepeating finde ich nicht besonders sinnvoll. Zum einen, weil ich alle Funktionen mit String-Parametern doof finde, zum anderen aber auch, weil das in diesem Fall quasi Update in schlechter lesbar wäre.

vor 3 Stunden schrieb Jomnitech:

Fixed Update wird nicht einmal pro Frame ausgeführt. Das mach die normale Update Methode. Fixed Update ist laut Dokumentation 50x pro Sekunde.

Korrekt, und die 50 sind einstellbar.

Allerdings müsste man immer ein kleines Sternchen einfügen, denn man darf da nicht an einen Aufruf alle 0.02 Sekunden denken - das ist technisch einfach absolut nicht möglich.

vor 3 Stunden schrieb Reggie():

oder per coroutine und in der Schleife kann ich dann mit yield return waitforsecs() die genaue Wartezeit zwischen jedem Zwischenschritt bestimmen?

Relativ genau. Was willst denn du jetzt eigentlich genau machen? Ich hatte gedacht, es geht um das Bewegen eines Objekts von A nach B über einen bestimmten Zeitraum. Dafür sind Coroutinen Perfekt, un @Jomnitech sollte sie sich dringend mal ansehen ;)

private IEnumerator MoveTo(Vector3 target, float duration)
{
  var start = transform.position;
  
  for (var time = Time.deltaTime; time < duration; time += Time.deltaTime)
  {
    var t = time / duration;
    transform.position = Vector3.Lerp(start, target, t);
    
    yield return null; // Warte einen Frame
  }
  
  transform.position = target;
}

Folgendermaßen einmalig (nicht in Update immer wieder) zu einem beliebigen Zeitpunkt aufzurufen wie folgt:

StartCoroutine(MoveTo(targetPosition, 5f));

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...