Pregunta

Tengo este método (dentro de una unidad C # Script), pero no entiendo cómo la parte "rendimiento" realmente funciona.

Sé que desde el MSDN que la función devolverá un IEnumerator que podría iterar throught, pero este código espera 1,5 segundos y no recibe iteradas, porque esto significaría, los objetos creados en el interior se crearon varias veces. ¿Hay alguien aquí que me puede explicar cómo funciona el código?

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;
}
¿Fue útil?

Solución

El enumerador el compilador genera para usted está siendo repetido. Una vez.

El compilador generará una clase que implementa IEnumerator, que tiene una función MoveNext () y una propiedad actual. La clase tendrá todos los elementos necesarios para almacenar el estado de la función entre las llamadas. Los detalles exactos se pueden considerar "Compilador mágica".

El objeto de esta clase generada, será manejado y administrado por el Unity3d motor. El Unity3d Motor llamará MoveNext () en cada corrutina activa una vez cada cuadro (a menos que se indique lo contrario).

Esto permitió a la Unity3d programador de secuencias de comandos de escritura que se juegan fuera un cuadro a la vez. Una combinación de magia C # compilador y resultados mágicos Unity3d motor en muy potente pero fácil de usar secuencias de comandos.

Para responder a su pregunta:. El código en su función se ejecutará una vez, sino que se detendrá en la declaración 'yield return'

Como se mencionó anteriormente, un objeto especial que implementa IEnumerator es creado por el compilador de C #.

En la primera llamada a MoveNext (), su función crea una explosión y establece el objeto actual a "nuevos WaitForSeconds (1.5f)".

El motor Unity3d inspecciona este objeto, ve que es una instancia de la clase "WaitForSeconds" especiales por lo que pone el empadronador en alguna cola de espera, y no pregunte por el segundo elemento de hasta 1,5 segundos han pasado. Mientras tanto, muchos cuadros son renderizados y se jugarán la explosión.

Después de 1,5 seg, la Unidad será grap el empadronador de la cola, y llamar a MoveNext () de nuevo. La segunda parte de su función se ejecutará ahora, pero dejará de generar un segundo objeto. MoveNext () devolverá false para indicar que no se pudo obtener un nuevo elemento, que es la señal de Unity3d para lanzar este enumerador de distancia. El recolector de basura reclamará la memoria en algún momento en el tiempo.

Como se dijo: un montón de compilador y la magia Unity3d que está pasando. Como siempre que se recuerde que su función se pone en espera hasta el siguiente fotograma en cada instrucción de retorno de rendimiento, sabrá lo suficiente para beneficiarse de las funciones especiales.

Otros consejos

Si yield se utiliza una vez, es como si se devuelve un IEnumerator con un elemento, por eso se tiene la impresión de que no lo hace iterate.

Es un uso bastante extraño de la palabra clave de rendimiento, que es difícil de entender por qué se llevó a cabo de manera sin ver todo el contexto.

Es mejor volver IEnumerable en lugar de IEnumerator ya que es más flaxible y fácil de usar. Incluso es mejor usar IEnumerable<T>. Rendimiento de retorno es sólo el azúcar sintáctica para la implementación de un bloque de iterador, el compilador genera el código relevante, ya que es esencialmente placa de la caldera estándar que se puede generar fácilmente mediante programación. Por lo general, utiliza el retorno de rendimiento cuando se quiere hacer una serie de acciones individuales apear a ser una colección, por ejemplo:.

public IEnumerable<Thing> GetThings()
{
    yield return GetNextThing();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top