¿`Return return false;` tiene un significado especial en los scripts de Unity3d C #?

17

En Unity, tenemos algunas cosas especiales para las rutinas que son adicionales al C # normal.

por ejemplo, podemos usar

yield return WaitForSeconds(5.f);

para tener una rutina espere 5 segundos antes de continuar.

¿Qué hacer yield return false;y yield return true;hacer?

Almo
fuente
hm, no estoy seguro si yield return truehace algo especial. Pero yield return nullsimplemente hace una pausa para un cuadro, por lo que sospecho que yield return falsetiene exactamente el mismo efecto (también yield return 0dado que 0 falsos nulos son todos iguales bajo el capó)
jhocking
@jhocking “ya que 0 falsos nulos son todos iguales bajo el capó” ¿Por qué eso importa? C # es en gran medida un lenguaje fuertemente tipado, por lo que la mayoría de las veces, no importa cómo se ve algo "oculto". Por ejemplo, no puede simplemente hacer if (0)o if (null), a diferencia de C y C ++.
svick
encogerse de hombros, entonces no importa. todo lo que sé es que yield return 0funciona; aparentemente por la razón que MLM explicó
jhocking
2
Esto no es adicional al C # normal. La yieldpalabra clave ha existido desde al menos C # 2.0. Todo lo que Unity hace es llamarlo de rutina y manejar el iterador generado y los valores devueltos por él de manera que pueda causar retrasos sin bloqueo en la ejecución de su código.
O Mapper
1
@Almo: Eso es simplemente porque WaitForSecondsno se declara. Tan pronto como declare un método llamado WaitForSecondsque tome un argumento flotante y que devuelva el tipo de elemento de la enumeración que está implementando, se volvería a compilar. Por lo tanto, yieldno es especial para la Unidad. En todo caso, el WaitForSecondsmétodo es especial para Unity, pero aun así, no extiende el lenguaje C #, sino que es simplemente un método adicional que se escribió utilizando C # estándar.
O Mapper

Respuestas:

19

Los únicos valores de rendimiento posibles que comprende el planificador son:

  • Las clases derivadas de YieldInstruction( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest, AssetBundleRequesty Coroutine
  • un WWWobjeto
  • "cualquier otro valor" que no sea uno de los anteriores.

Si se obtiene "cualquier otro valor" (que incluye "nulo" un valor de cadena de cualquier otro tipo básico como int, bool , ... o una referencia a un objeto arbitrario que no sea uno de los mencionados anteriormente) el programador "programe" la corutina para el siguiente cuadro .

- Respuesta de Bunny83: miembro destacado en Unity Answers

El WaitForEndOfFramey otros similares son funciones en blanco que etiquetan YieldInstructionpara decidir qué hacer en el motor.

El caso predeterminado parece ser WaitForEndOfFrame. Entonces, si yield returnalgo que no tiene un significado especial, como un bool, es lo mismo que WaitForEndOfFrame.

No parece haber ninguna documentación oficial sobre este comportamiento.


Actualizar

Rutter comentó sobre otro caso especial:yield return null

Todas las rutinas de Unity yield return null, incluidas las ejecutadas antes de que se procese el marco, excepto WaitForEndOfFrame. Puede encontrar la increíble respuesta de rutter en Respuestas de Unity que lo explican más detalladamente (se incluyen diagramas bonitos).

MLM
fuente
66
Es común suponer que ceden nully WaitForEndOfFrameson iguales, pero en realidad son ligeramente diferentes , como se detalla en la página del manual de órdenes de ejecución .
rutter