43. CLASE MONOBEHAVIOUR (III)
StartCoroutine:
function StartCoroutine (routine : IEnumerator) : Coroutine
Antes de entrar a analizar esta función quisiera explicar aunque fuera de forma superficial lo que es una corutina y cómo son tratadas por Unity.
Una corutina es una función -que individualizamos con la palabra clave yield- que puede suspender su ejecución hasta que una instruction dada -que también contendrá la palabra clave yield- termine. Veámoslo con un ejemplo sacado del manual de referencia de Unity:
//Imprime Starting 0.0
print ("Starting " + Time.time);
/* Se llama a continuación a la función WaitAndPrint como coroutine, cosa que se
consigue anteponiendo la palabra clave yield. Al hacer esto permitimos que la
función se pueda suspender por una instrucción yield. Por lo tanto, el flujo del
script se va a la función waitandprint, donde se encuentra con una instrucción yield
que le dice que espere cinco segundos, luego imprimirá “WaitandPrint 5.0 (que será
el tiempo transcurrido desde el inicio del cómputo) y volverá arriba para imprimir
“done 5.0” (o un número cercano).*/
yield WaitAndPrint();
print ("Done " + Time.time);
function WaitAndPrint () {
// suspende la ejecución por 5 segundos
yield WaitForSeconds (5);
print ("WaitAndPrint "+ Time.time);
}
Si no veis clara la diferencia con el proceso secuencial habitual, no tenéis más que borrar la palabra yield que está antes de la llamada a la función. Si hacéis eso, el programa empezará escribiendo "starting 0", bajará a la siguiente instrucción, donde se encuentra con la función WaitAndPrint, que le indica que no va a hacer nada durante cinco segundos, así que pasará inmediatamente a la siguiente declaración e imprimirá "Done 0", para luego, cinco segundos después, imprimir por fin "Waitandprint 5".
Bien. Con estas nociones vamos ya a la función que nos ocupa, StartCoroutine. Como su nombre indica, inicia una corrutina cuya ejecución puede ser pausada en cualquier momento usando una instrucción yield.
Programando en javascript, no es necesario escribir StartCoroutine, ya que el compilador la dará por supuesta.
Veamos un segundo ejemplo sacado igualmente del manual de referencia de Unity. En este ejemplo, a diferencia del anterior, vamos a invocar una corrutina que no suspenderá la ejecución de la función que se desarrolla en paralelo:
function Start() {
// - Después de 0 segundos imprimirá "Starting 0.0"
// - Después de 0 segundos, imprimirá "Before WaitAndPrint Finishes 0.0"
// - Después de 2 segundos imprimirá "WaitAndPrint 2.0"
//Empezamos (función Start) imprimiendo “Starting 0.0”
print ("Starting " + Time.time);
/* Ahora vamos a iniciar la función WaitAndPrint como coroutine (en paralelo), pero
sin suspender el flujo de llamadas a funciones que se puedan seguir dando en el hilo
principal. Si hubiéramos querido suspenderlo, hubiéramos utilizado la fórmula del
ejemplo anterior, y hubiéramos antepuesto la palabra clave yield a la llamada a la
función.
Lo que sigue podría también haberse escrito (en javascript) así:
WaitAndPrint(2.0)
y el compilador añadiría el StartCoroutine por ti automáticamente.*/
StartCoroutine(WaitAndPrint(2.0));
/*Como no hemos interrumpido el flujo principal con yield, la declaración que viene
ahora se ejecutará antes que la la función anterior, puesto que la anterior ha de
esperar dos segundos y el print que viene ahora no.*/
print ("Before WaitAndPrint Finishes " + Time.time);
}
function WaitAndPrint (waitTime : float) {
// suspende la ejecución por los segundos que le fijemos en waitTime
yield WaitForSeconds (waitTime);
print ("WaitAndPrint "+ Time.time);
}
La función StartCoroutine tiene una segunda modalidad:
function StartCoroutine (methodName : String, value : object = null) : Coroutine
Es como la función anterior, pero usando un string. Esta variante tiene una mayor sobrecarga de procesamiento, pero es la única que se puede detener con StopCoroutine.
Vamos a realizar otro ejemplo en el que , aparte de usar la variante con string de la función, aprovecharemos para ilustrar de nuevo otra posibilidad que nos dan este tipo de instrucciones Yield. El script ejecuta la función DoSomething, que dispara un bucle. Al siguiente frame el script se detendrá un segundo al toparse con la instrucción yield, pasará al yielf waitforseconds, esperará un segundo y luego se detendrá.
function Start () {
StartCoroutine("DoSomething", 2.0);
yield WaitForSeconds(1);
StopCoroutine("DoSomething");
}
function DoSomething (someParameter : float) {
while (true) {
print("DoSomething Loop");
// Detiene la ejecución de esta corutina y vuelve al loop principal hasta el
//siguiente frame.
yield;
}
}
StopCoroutine:
function StopCoroutine (methodName : String) : void
Como hemos visto en el ejemplo anterior, detiene las corrutinas con el nombre que le suministramos como parámetro iniciadas en este script. Dicho nombre de función lo hemos de pasar como un string, y no hemos de olvidar que sólo las corrutinas con el nombre indicado que se hayan iniciado mediante la variante string de StartCoroutine (la segunda modalidad de las anteriormente vistas) podrán ser detenidas con StopCoroutine.
StopAllCoroutines:
function StopAllCoroutines () : void
Detiene todas las corrutinas que estén corriendo en ese script.
Con la tecnología de Blogger.
BUSCADOR
PÁSATE POR EL FORO
API DE UNITY
TEMAS
- 00_INTRODUCCION (3)
- 01_CLASE OBJECT (3)
- 02_ESTRUCTURA VECTOR3 (4)
- 03_CLASE TRANSFORM (7)
- 04_CLASE RIGIDBODY (8)
- 05_CLASE COLLIDER (2)
- 06_CLASE MESHCOLLIDER (1)
- 07_CLASE CHARACTERCONTROLLER (3)
- 08_CLASE RENDERER (2)
- 09_CLASE MESHFILTER (1)
- 10_CLASE JOINT (2)
- 11_CLASE HINGEJOINT (2)
- 12_CLASE SPRINGJOINT (1)
- 13_CLASE CHARACTERJOINT (1)
- 14_CLASE BEHAVIOUR (1)
- 15_CLASE MONOBEHAVIOUR (9)
- 16_CLASE CAMERA (6)
- 17_CLASE LIGHT (3)
- 18_CLASE MATERIAL (3)
- 19_CLASE CUBEMAP (1)
- 20_CLASE RENDERTEXTURE (3)
- 21_CLASE PARTICLEEMITTER (3)
- 22_CLASE MESH (2)
- 23_CLASE GAMEOBJECT (6)
- 24_CLASE SHADER (1)
- 25_CLASE PHYSICMATERIAL (1)
- 26_CLASE COMPONENT (1)
- 27_CLASE GUIELEMENT (1)
- 28_CLASE GUITEXT (2)
- 29_CLASE GUITEXTURE (1)
- 30_CLASE GUI (8)
- 31_CLASE GUILAYOUT (4)
- 32_CLASE TEXTURE (1)
- 33_CLASE TEXTURE2D (2)
- 34_CLASE INPUT (4)
- 35_ESTRUCTURA BOUNDS (1)
- 36_CLASE COLLISION (1)
- 37_CLASE CONTROLLERCOLLIDERHIT (1)
- 38_CLASE DEBUG (1)
- 39_CLASE EVENT (3)
- 40_CLASE GIZMOS (1)
- 41_CLASE LIGHTMAPSETTINGS (1)
- 42_ESTRUCTURA MATHF (3)
- 43_CLASE PHYSICS (2)
- 44_ESTRUCTURA QUATERNION (1)
- 45_CLASE RANDOM (1)
- 46_ESTRUCTURA RAY (1)
- 47_ESTRUCTURA RAYCASTHIT (1)
- 48_ESTRUCTURA RECT (1)
- 49_CLASE RENDERSETTINGS (1)
- 50_CLASE SCREEN (1)
- 51_CLASE TIME (1)
- 52. CLASE YIELDINSTRUCTION (1)
- MONOGRAFICOS (2)
ENTRADAS
-
▼
2011
(127)
-
▼
octubre
(121)
- 116. ESTRUCTURA RAYCASTHIT
- 115. ESTRUCTURA RAY
- 114. CLASE RANDOM
- 113. ESTRUCTURA QUATERNION
- 112. CLASE PHYSICS (y II)
- 111. CLASE PHYSICS (I)
- 110. ESTRUCTURA MATHF (y III)
- 109. ESTRUCTURA MATHF (II)
- 108. ESTRUCTURA MATHF (I)
- 107. CLASE LIGHTMAPSETTINGS
- 106. CLASE GIZMOS
- 105. CLASE EVENT (y III)
- 104. CLASE EVENT (II)
- 107. CLASE EVENT (I)
- 106. CLASE DEBUG
- 105. CLASE CONTROLLERCOLLIDERHIT
- 104. CLASE COLLISION
- 103. ESTRUCTURA BOUNDS
- 102. CLASE INPUT (y IV)
- 101. CLASE INPUT (III)
- 100. CLASE INPUT (II)
- 99. CLASE INPUT (I)
- 98. CLASE TEXTURE2D (y II)
- 97. CLASE TEXTURE2D (I)
- 96. CLASE TEXTURE
- 95. CLASE GUILAYOUT (y IV)
- 94. CLASE GUILAYOUT (III)
- 93. CLASE GUILAYOUT (II)
- 92. CLASE GUILAYOUT (I)
- 91. CLASE GUI (y VIII)
- 90. CLASE GUI ( VII)
- 89. CLASE GUI (VI)
- 88. CLASE GUI (V)
- 87. CLASE GUI (IV)
- 86. CLASE GUI (III)
- 85. CLASE GUI ( II)
- 84. CLASE GUI (I)
- 83. CLASE GUITEXTURE
- 82. CLASE GUITEXT (y II)
- 81. CLASE GUITEXT (I)
- 80. CLASE GUIELEMENT
- 79. CLASE COMPONENT
- 78. CLASE PHYSICMATERIAL
- 77. CLASE SHADER
- 76. CLASE GAMEOBJECT (y VI)
- 75. CLASE GAMEOBJECT (V)
- 74. CLASE GAMEOBJECT (IV)
- 73. CLASE GAMEOBJECT (III)
- 72. CLASE GAMEOBJECT (II)
- 71. CLASE GAMEOBJECT (I)
- 70. CLASE MESH (y II)
- 69. CLASE MESH (I)
- 68. CLASE PARTICLEEMITTER (y III)
- 67. CLASE PARTICLEEMITTER (II)
- 66. CLASE PARTICLEEMITTER (I)
- 65. CLASE RENDERTEXTURE (y III)
- 64. CLASE RENDERTEXTURE (II)
- 63. CLASE RENDERTEXTURE (I)
- 62. CLASE CUBEMAP
- 61. CLASE MATERIAL (y III)
- 60. CLASE MATERIAL (II)
- 59. CLASE MATERIAL (I)
- 58. CLASE LIGHT (y III)
- 57. CLASE LIGHT (II)
- 56. CLASE LIGHT (I)
- 55. CLASE CAMERA (VI)
- 54. CLASE CAMERA (V)
- 53. CLASE CAMERA (IV)
- 52. CLASE CAMERA (III)
- 51. CLASE CAMERA (II)
- 50. CLASE CAMERA (I)
- 49. CLASE MONOBEHAVIOUR (y IX)
- 48. CLASE MONOBEHAVIOUR (VIII)
- 47. CLASE MONOBEHAVIOUR (VII)
- 46. CLASE MONOBEHAVIOUR (VI)
- 45. CLASE MONOBEHAVIOUR (V)
- 44. CLASE MONOBEHAVIOUR (IV)
- 43. CLASE MONOBEHAVIOUR (III)
- 42. CLASE MONOBEHAVIOUR (II)
- 41. CLASE MONOBEHAVIOUR (I)
- 40. CLASE BEHAVIOUR
- 39. CLASE CHARACTERJOINT
- 38. CLASE SPRINGJOINT
- 37. CLASE HINGEJOINT (y II)
- 36. CLASE HINGEJOINT (I)
- 35. CLASE JOINT (y II)
- 34. CLASE JOINT (I)
- 33. CLASE MESHFILTER
- 32. CLASE RENDERER (y II)
- 31. CLASE RENDERER (I)
- 30. CLASE CHARACTERCONTROLLER (y III)
- 29. CLASE CHARACTERCONTROLLER (II)
- 28. CLASE CHARACTERCONTROLLER (I)
- 27. CLASE MESHCOLLIDER
- 26. CLASE COLLIDER (II)
- 25. CLASE COLLIDER (I)
- 24. CLASE RIGIDBODY (y VIII)
- 23. CLASE RIGIDBODY (VII)
- 22. CLASE RIGIDBODY (VI)
- 21. CLASE RIGIDBODY (V)
-
▼
octubre
(121)