Frage

Ich habe diese Methode (in einer Einheit C # Script), aber ich verstehe nicht, wie der „Ausbeute“ Teil tatsächlich funktioniert.

Ich weiß aus der MSDN dass die Funktion einen IEnumerator zurück, die ich iterieren Throught könnte, aber dieser Code wartet 1,5 Sekunden und nicht wiederholt erhalten, weil dies bedeuten würde, die im Inneren erzeugten Objekten mehrfach erstellt wurden. Jeder hier, der mich, wie dieser Code funktioniert erklären kann?

IEnumerator DestroyShip()
{
    // create new gameobject
    Instantiate(ExplosionPrefab, transform.position, transform.rotation);
    // make current gameobject invisible
    gameObject.renderer.enabled = false;
    // set new position for the current gameobject
    transform.position = new Vector3(0f, transform.position.y, transform.position.z);
    // wait for 1,5 seconds 
    yield return new WaitForSeconds(1.5f);
    // make the current gameobject visible again
    gameObject.renderer.enabled = true;
}
War es hilfreich?

Lösung

Der Enumerator der Compiler generiert für Sie iteriert wird. Einmal.

Der Compiler wird eine Klasse, die implementiert IEnumerator erzeugen, die eine Movenext () Funktion und eine Current-Eigenschaft. Die Klasse haben alle Mitglieder erforderlich, um den Zustand der Funktion zwischen den Anrufen zu speichern. Die genauen Details können "Compiler Magic" in Betracht gezogen werden.

Das Ziel dieser generierten Klasse, wird von dem Unity3d Motor gehandhabt und verwaltet werden. Der Unity3d Motor ruft Movenext () auf jedem aktiven Koroutine einmal jeden Rahmen (wenn nicht anders angegeben).

Damit konnte die Unity3d Programmierer schreiben zu können Skripte, die aus einem Rahmen zu einer Zeit gespielt werden. Eine Kombination aus C # Compiler Magie und Unity3d Motor Magie führt zu einer sehr mächtig-but-easy-to-use-Scripting.

Um Ihre Frage zu beantworten:. Der Code in Ihrer Funktion wird einmal ausgeführt werden, aber es wird in der ‚yield return‘ Aussage Pause

Wie oben, ein spezielles Objekt festgestellt, dass Geräte IEnumerator durch das C # Compiler erstellt wird.

Beim ersten Aufruf von Movenext (), Ihre Funktion erzeugt eine Explosion und setzt das aktuelle Objekt „neuen WaitForSeconds (1,5 f).“

Die Unity3d Motor prüft dieses Objekt sieht es eine Instanz der Sonderklasse „WaitForSeconds“ so setzt den Enumerator auf einige Warteschleife und wird nicht für das zweite Element fragen, bis 1,5 Sekunden vergangen sind. In der Zwischenzeit werden viele Bilder gemacht und die Explosion wird abgespielt.

Nach 1,5 Sekunden wird die Einheit den Enumerator aus der Warteschlange grap, und rufen Sie Movenext () erneut. Der zweite Teil Ihrer Funktion ausführen wird jetzt, aber scheitern wird ein zweites Objekt zu erzeugen. Movenext () wird return false es angegeben habe ein neues Element zu erhalten, die das Signal an Unity3d entfernt dieses enumerator zu werfen. Der Garbage Collector wird den Speicher zu einem bestimmten Zeitpunkt in der Zeit zurückfordern.

Wie gesagt: viele Compiler und Unity3d Magie passiert. Solange Sie, dass Ihre Funktion in der Warteschleife, bis das nächste Bild an jeder yield return-Anweisung gesetzt werden erinnern, werden Sie genug, um Nutzen aus diesen Sonderfunktionen kennen.

Andere Tipps

Wenn yield einmal verwendet wird, ist es, als ob Sie einen IEnumerator mit einem Element zurückkehrten, das ist, warum man den Eindruck, dass es funktioniert Iterierte nicht.

Es ist eine ziemlich seltsame Verwendung des Ertrages Schlüsselwort, es ist schwer zu verstehen, warum es umgesetzt wurde, so, ohne den gesamten Kontext zu sehen.

Es ist besser, IEnumerable zurückzukehren, anstatt IEnumerator wie es flaxible ist und einfach zu bedienen. Es ist sogar besser zu Einsatz IEnumerable<T>. Ausbeute Rückkehr ist nur syntaktischer Zucker für die Implementierung eines Iteratorblock erzeugt der Compiler den Code relevent wie es im wesentlichen Standard-Kesselblech ist, das leicht programmatisch erzeugt werden kann. Sie in der Regel yield return verwenden, wenn Sie eine Reihe von einzelnen Aktionen machen wollen apear eine Sammlung zu sein, z.

public IEnumerable<Thing> GetThings()
{
    yield return GetNextThing();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top