Unity 3D Game Engine – JavaScript – Coroutines
Coroutines permettono di gestire comportamenti complessi tra classi differenti.
Coroutines possono essere pensate come funzioni da eseguire a intervalli.
Le Coroutine vanno pecificate con Maiuscolanome+Coroutine, ad esempio MyCoroutine StopCoroutine etc…
Basic
1. Creo un Cube
2. Creo una Sphere ed assegno Coroutine.js
Coroutine.js:
#pragma strict public var smoothing : float = 1f; public var target : Transform; // Inspector DRAG over here another GameObject function Start () { MyCoroutine(target); } function MyCoroutine (target : Transform) { while(Vector3.Distance(transform.position, target.position) > 0.05f) { transform.position = Vector3.Lerp(transform.position, target.position, smoothing * Time.deltaTime); yield; } print("Reached the target."); yield WaitForSeconds(3f); print("MyCoroutine is now finished."); }
3. Sphere> Inspector> Couroutine.js> DRAG AND DROP Cube GameObject over var target
4. Play: Sphere raggiungerà si muoverà con interpolazione lineare (Lerp) il Cubo-> print(“Reached the target.”)-> dopo 3 sec-> print(“MyCoroutine is now finished.”);
Come funziona?
1. Start() si avvia al caricamento dello script
2. Start() invia alla funzione MyCoroutine() il valore della variabile target, che è la posizione XYZ di Cube
Proprietà
Assegno a Sphere:
PropertiesAndCoroutines.js
#pragma strict public var smoothing : float = 7f; private var target : Vector3; function SetTarget(value : Vector3) { target = value; StopCoroutine("Movement"); StartCoroutine("Movement", target); } function Movement (target : Vector3) { while(Vector3.Distance(transform.position, target) > 0.05f) { transform.position = Vector3.Lerp(transform.position, target, smoothing * Time.deltaTime); yield; } }
Assegno al piano dove si muoverà Sphere
ClickSetPosition.js
#pragma strict public var coroutineScript : PropertiesAndCoroutines; // richiama lo script sopra function OnMouseDown () { var ray : Ray = Camera.main.ScreenPointToRay(Input.mousePosition); var hit : RaycastHit; Physics.Raycast(ray, hit); if(hit.collider.gameObject == gameObject) { var newTarget : Vector3 = hit.point; // invia il parametro target allo script PropertiesAndCoroutines coroutineScript.SetTarget(newTarget); } }
Come funziona?
1. ClickSetPosition.js
– al click il RayCast, calcolato da Camera.main definisce un valore Vector3 XYZ di posizione
– il valore viene mandato alla Coroutine con coroutineScript.SetTarget(newTarget)
2. PropertiesAndCoroutines.js
– riceve il valore XYZ
– ferma la Couroutine, se l’oggetto si sta muovendo viene arrestato
– avvia di nuovo la Courotine, l’oggetto si sposterà verso la nuova destinazione.
Other Examples
Ex 1
function MyCoroutine() { DoSomething(): yield; // wait one frame DoSomethingElse(); }
Ex 2
function MyCoroutine() { DoSomething(): //Do this immediately yield; //Return control to the caller DoSomethingElse(); //This will be executed one frame later } void Start() { MyCoroutine(); }
Ex 3
function MyCoroutine() { print("This is printed second"); yield; //Return control to the Start function print("This is printed one fourth, exactly one frame after the third"); } void Start() { print("This is printed first"); MyCoroutine(); print("This is printed third"); }
Ex 4
function MyCoroutine() { DoSomething(): //Do this immediately yield WaitForSeconds(2); //Return control to the caller DoSomethingElse(); //This will be executed 2 seconds after } void Start() { MyCoroutine(); }
Ex 5
function MyCoroutine() { DoSomething(): //Do this immediately yield MyOtherCoroutine(); //Go and execute MyOtherCoroutine! DoSomethingElse(); //This will be executed after MyOtherCoroutine finished execution } function MyOtherCoroutine() { DoStuff(): //Do this immediately yield WaitForSeconds(2); //Return control to the caller (in this case the Start function) DoMoreStuff(); //This will be executed 2 seconds after //MyOtherCoroutine finishes execution here } void Start() { MyCoroutine(); }
References:
– unity3d.com/
– http://www.blog.silentkraken.com/2010/01/22/coroutines-in-unity3d/