Domanda

ho ottenuto questo metodo (all'interno di un'Unità C # Script), ma non capisco come funziona in realtà la parte "resa".

Lo so da MSDN che la funzione restituisce un IEnumerator che ho potuto scorrere throught, ma questo codice attende 1,5 secondi e non viene ripetuto, perché questo vorrebbe dire, gli oggetti creati all'interno sono stati creati più volte. Qualcuno qui che mi può spiegare come funziona il codice?

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;
}
È stato utile?

Soluzione

L'Enumerator il compilatore genera per voi è essere iterate. Una volta.

Il compilatore genera una classe che implementa IEnumerator, che ha una funzione MoveNext () e una proprietà Current. La classe avrà tutti i componenti necessari per memorizzare lo stato della funzione tra le chiamate. I dettagli esatti possono essere considerati "Compiler Magic".

L'oggetto di questa classe generata, sarà gestito e gestito dal motore Unity3d. Il motore Unity3d chiamerà MoveNext () su ogni coroutine attiva una volta ogni fotogramma (salvo diversa indicazione).

Ciò ha permesso alla Unity3d programmatore di script di scrittura che sono giocati fuori di un fotogramma alla volta. Una combinazione di compilatore C # magia e risultati magici Unity3d motore molto potente, ma-facile da usare script.

Per rispondere alla tua domanda:. Il codice nella funzione verrà eseguita una volta, ma si metterà in pausa la dichiarazione 'dei rendimenti'

Come già detto, uno speciale oggetto che implementa IEnumerator è creato dal compilatore C #.

La prima chiamata a MoveNext (), la funzione crea un'esplosione e imposta l'oggetto corrente ai "nuovi WaitForSeconds (1.5F)".

Il motore Unity3d ispeziona questo oggetto, vede si tratta di un'istanza della classe speciale "WaitForSeconds" in modo mette l'enumeratore su alcuni coda di attesa, e non chiederà per il secondo elemento fino a 1,5 secondi sono passati. Nel frattempo, molti fotogrammi saranno resi e l'esplosione verranno riprodotti.

Dopo 1,5 sec, l'unità sarà grap l'enumeratore dalla coda, e chiamare MoveNext nuovo (). La seconda parte della vostra funzione eseguirà ora, ma non riuscirà a generare un secondo oggetto. MoveNext () restituirà false per indicare che non è riuscito a ottenere un nuovo elemento, che è il segnale per Unity3d gettare questo enumeratore via. Il Garbage Collector recuperare la memoria a un certo punto nel tempo.

Come diceva: un sacco di compilatore e la magia Unity3d sta succedendo. Finché si ricorda che la funzione verrà messa in attesa fino al fotogramma successivo ad ogni dichiarazione dei rendimenti, saprete abbastanza per beneficiare di tali funzioni speciali.

Altri suggerimenti

Se yield viene utilizzata una sola volta, è come se si stesse restituendo un IEnumerator con un elemento, questo è il motivo per cui si ha l'impressione che non è così iterate.

E 'un uso piuttosto strana della parola chiave snervamento, è difficile capire il motivo per cui è stato attuato in modo senza vedere l'intero contesto.

E 'meglio tornare IEnumerable piuttosto che IEnumerator come è più flaxible e facile da utilizzare. E 'anche meglio per l'uso IEnumerable<T>. yield return è solo zucchero sintattico di realizzare un blocco iteratore, il compilatore genera il codice relevent com'è caldaia piastra essenzialmente standard che può essere facilmente generato programatically. Si utilizzano in genere dei rendimenti quando si vuole fare una serie di azioni singole apear essere una raccolta, per esempio:.

public IEnumerable<Thing> GetThings()
{
    yield return GetNextThing();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top