with waituntil waitforseconds unity startcoroutine run monobehaviour corrutinas c# unity3d yield yield-return

c# - waituntil - waitforseconds unity



¿Cómo funciona esto con un "rendimiento" en detalle? (3)

El enumerador que el compilador genera para usted se está iterando. Una vez.

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

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

Esto permitió al programador de Unity3d escribir scripts que se reproducen un cuadro a la vez. Una combinación de la magia del compilador de C # y la magia del motor de Unity3d da como resultado una secuencia de comandos muy poderosa pero fácil de usar.

Para responder a su pregunta: el código en su función se ejecutará una vez, pero se detendrá en la declaración ''rendimiento devuelto''.

Como se indicó anteriormente, el compilador de C # crea un objeto especial que implementa IEnumerator.

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

El motor de Unity3d inspecciona este objeto, ve que es una instancia de la clase especial "WaitForSeconds", por lo que pone el enumerador en una cola de espera y no solicitará el segundo elemento hasta que hayan transcurrido 1.5 segundos. Mientras tanto, se renderizarán muchos cuadros y se reproducirá la explosión.

Después de 1,5 segundos, Unity colocará el enumerador de la cola y llamará nuevamente a MoveNext (). La segunda parte de su función se ejecutará ahora, pero no generará un segundo objeto. MoveNext () devolverá false para indicar que no pudo obtener un nuevo elemento, que es la señal a Unity3d para descartar este enumerador. El recolector de basura recuperará la memoria en algún momento.

Como se dijo: muchos de los compiladores y la magia de Unity3d están sucediendo. Siempre que recuerde que su función se mantendrá en espera hasta el próximo cuadro en cada declaración de rendimiento, sabrá lo suficiente como para beneficiarse de esas funciones especiales.

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

Sé por MSDN que la función devolverá un IEnumerator que podría recorrer en iteración, pero este código espera 1,5 segundos y no se itera porque significaría que los objetos creados en el interior se crearon varias veces. ¿Alguien aquí que pueda explicarme cómo funciona este 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; }


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

public IEnumerable<Thing> GetThings() { yield return GetNextThing(); }


Si el yield se usa una vez, es como si devolviera un IEnumerator con un elemento, por eso tiene la impresión de que no itera.

Es un uso bastante extraño de la palabra clave yield, es difícil entender por qué se implementó sin ver todo el contexto.