2016-07-20 26 views
2

TL, DR: Ist es sicher, Time.deltaTime als Wartezeit für die Ausbeute in einer Coroutine zu verwenden?Unity3D - Time.deltaTime als Wartezeit für eine Coroutine verwenden

Um unnötige Logik in Update() für kurzlebige Funktionalität zu vermeiden, werde ich oft eine Coroutine ausführen. Zum Beispiel habe ich in meinem Spiel eine langsame Coroutine, die regelmäßig die Distanz zwischen NPCs und dem Spieler überprüft, wenn diese Distanz unter einer Schwelle liegt, werde ich dann eine häufigere Coroutine mit teureren Sichtlinien-Tests mit Raycasting usw. durchführen viel effizienter als alles in Update() ständig zu überprüfen.

Meine Frage ist: Ist es sicher, Time.deltaTime als Wartezeit für die Ausbeute zu verwenden, und dabei Update() für die Dauer der Coroutine zu simulieren? Das ist, wenn der nächste Frame länger dauert als der letzte - wird die Coroutine bis zum nächsten Frame verzögert, oder ist etwas Schreckliches passiert, so wie der ganze Frame verzögert wird, bis die Coroutine fertig ist? Ich bin versucht, einen Puffer für die Sicherheit zuzulassen, z.B. yield return new WaitForSeconds(Time.deltaTime * 1.2f); aber im Idealfall würde ich gerne genau jeden Frame ausführen.

+0

th Das ist ** total, komplett, falsch **. Sie verwenden einfach "Aufrufen" für einfache Timer in Unity. – Fattie

+0

Verwenden Sie einfach "yield return null", um einen Frame zu überspringen. tue zehn davon, um zehn Frames zu überspringen. oder einfach überspringen sagen "eine halbe Sekunde". aber wenn es aus irgendeinem Grund eine lange Zeit dauerte, * ein paar Entfernungen zu überprüfen, dann machst du etwas unglaublich falsch. Berücksichtige die gewaltige Menge an Berechnungen, die Unity machen muss, um Dinge auf den Bildschirm zu rendern und physikalische Berechnungen durchzuführen !!Was Sie tun, ist "nichts" (es sei denn, etwas ist drastisch falsch). Es sind also alles gute Nachrichten. Du musst dir keine Sorgen machen! – Fattie

+0

http://www.unitygeek.com/coroutinets-in-unity3d/ das erklärt sehr gut –

Antwort

5

Ist es sicher, Time.deltaTime als Wartezeit für den Ertrag in einer Coroutine zu verwenden?

Nein. So funktioniert die WaitForSeconds Funktion nicht. WaitForSeconds dauert in Sekunden als ein Parameter nicht die winzigen Werte von Time.deltaTime in jedem Frame zur Verfügung gestellt.

Unten finden Sie ein Beispiel für die Verwendung der WaitForSeconds-Funktion.

IEnumerator waitFunction1() 
{ 
    Debug.Log("Hello Before Waiting"); 
    yield return new WaitForSeconds(3); //Will wait for 3 seconds then run the code below 
    Debug.Log("Hello After waiting for 3 seconds"); 
} 

Was mit Time.deltaTime warten, verwenden Sie es in der Regel in einer while Schleife zusätzlich zu einem anderen float Variable Sie increment oder decrement, bis Sie das gewünschte value.the Vorteil erreichen Time.deltaTime zu verwenden, ist, dass Sie sehen können, wie Während des Wartens bleibt viel Wartezeit. Sie können das für einen Countdown oder einen Timer verwenden. Sie setzen auch yield return null; in die while-Schleife, damit Unity andere Skripts ausführen kann und Ihre App nicht einfriert. Im Folgenden finden Sie ein Beispiel für die Verwendung von Time.deltaTime, um 3 Sekunden zu warten. Sie können es leicht in einen Countdown-Timer verwandeln.

IEnumerator waitFunction2() 
{ 
    const float waitTime = 3f; 
    float counter = 0f; 

    Debug.Log("Hello Before Waiting"); 
    while (counter < waitTime) 
    { 
     Debug.Log("Current WaitTime: " + counter); 
     counter += Time.deltaTime; 
     yield return null; //Don't freeze Unity 
    } 
    Debug.Log("Hello After waiting for 3 seconds"); 
} 
+1

Perfekt, danke – Absinthe

1

Wenn Sie jeden Rahmen zu überprüfen, gibt es WaitForEndOfFrame

Es gibt keinen Grund zu WaitForSeconds wenn Sie nicht bestimmte Zeit warten, müssen sich auf

können Sie yield return www auch darauf warten beenden

-Update gibt es CustomYieldInstruction und einige davon Erbe in Koroutine verwendet, wie WaitUntil

+0

Cool, weiß nicht, wie ich WaitForEndOfFrame verpasst habe, danke – Absinthe

+0

es ist gut zu wissen über 'WaitForEndOfFrame', aber das ist hier völlig irrelevant. – Fattie