Jump to content
Unity Insider Forum
Reggie()

Zeitsteuerung / feste Dauer

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....

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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.
 

Share this post


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

 

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

×