Votre première coroutine
Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 24 sur 71.
Update() doit se terminer à chaque image, il ne peut donc pas attendre. Une coroutine le peut : c’est une méthode qui se met en pause et reprend plus tard là où elle s’était arrêtée. Elle renvoie IEnumerator, ce qui nécessite using System.Collections;, et chaque yield return qu’elle contient correspond à une pause. En C#, yield return permet à une méthode de fournir ses valeurs une par une ; Unity demande la suivante une fois l’attente terminée. yield return null attend une image, et yield return new WaitForSeconds(3f) attend 3 secondes.
StartCoroutine(Cycle()) en démarre une. Ce feu passe au vert, puis au jaune 3 secondes plus tard, et au rouge après une seconde supplémentaire :
using System.Collections;
using UnityEngine;
public class TrafficLight : MonoBehaviour
{
Renderer lamp;
void Start()
{
lamp = GetComponent<Renderer>();
StartCoroutine(Cycle());
}
IEnumerator Cycle()
{
lamp.material.color = Color.green;
yield return new WaitForSeconds(3f);
lamp.material.color = Color.yellow;
yield return new WaitForSeconds(1f);
lamp.material.color = Color.red;
}
}StartCoroutine exécute immédiatement la coroutine jusqu’à son premier yield, puis Start() continue ; Unity la reprend après chaque attente, avec ses variables locales dans leur état précédent. Un simple Cycle(); sans StartCoroutine ne fait rien : il crée la méthode en pause, puis la supprime, sans qu’une seule ligne de celle-ci soit exécutée. Et yield return 3f; ne correspond pas à une attente de 3 secondes : Unity ne reconnaît que les objets d’attente tels que WaitForSeconds et traite toute autre valeur comme une image.
Défi
FacileFais bondir le piège à pointes avec une coroutine en appuyant sur Espace.
- Écris
IEnumerator Spring(): consigneClick,yield return new WaitForSeconds(0.5f);, puistransform.position += Vector3.up;. - Attends ensuite 2 secondes de la même façon, puis soustrais à nouveau
Vector3.up. - Dans le
ifassocié à la touche Espace, démarre-la avecStartCoroutine(Spring());.
Appuie sur « Jouer » et sur Espace : les pointes bondissent, puis s’abaissent. Ensuite, clique sur « Vérifier ».
Essayez vous-même
using System.Collections;
using UnityEngine;
public class SpikeTrap : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// Déclencher le piège avec une coroutine
}
}
// IEnumerator Spring(): cliquer, attendre 0.5 s, monter de 1 unité, attendre 2 s, descendre de 1 unité
}
Toutes les leçons de Physique et gameplay
1Corps rigide
Gravité et massePousser avec AddForceSauter avec une impulsionFixedUpdate pour la physiqueVitesseCorps cinématiquesRécapitulatif : plateforme de lancement4Coroutines
InvoquerInvokeRepeating, CancelInvokeVotre première coroutineBoucles dans les coroutinesArrêter les coroutinesRécapitulatif : compte à rebours7Rotation
Angles d’EulerQuaternionsRegardez dans la direction où vous vous déplacezTourner en douceurRécapitulatif : tourelle10Projet : Évasion de l’arène
L’arèneLes chasseurs2Collisions
OnCollisionEnterQu’est-ce que j’ai touché ?Se briser à l’impactRester au solRebond et frictionFormes des collidersRécapitulatif : mur destructible5Projet : Course aux pièces
La balle roulanteDes pièces à ramasser3Déclencheurs
Colliders déclencheursOnTriggerEnterObjets à ramasserLes caisses gardent le resteZones mortellesEntrée et sortieRécapitulatif : clé et porteEntraînez-vous par vous-même : Playground Unity