Coroutine'leri Durdurma
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 25 / 63.
StartCoroutine, başlattığı coroutine'e bir başvuru olan Coroutine döndürür. Bunu bir alanda sakla; StopCoroutine(handle), coroutine'i duraklatıldığı yerde durdurur: yield ifadesinden sonraki satırlar hiçbir zaman çalışmaz. StopAllCoroutines(), betiğin başlattığı tüm coroutine'leri durdurur. Boşluk tuşu bu alarmı açıp kapatır:
Coroutine beeping;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (beeping == null)
{
beeping = StartCoroutine(Beep());
}
else
{
StopCoroutine(beeping);
beeping = null;
}
}
}
IEnumerator Beep()
{
while (true)
{
Debug.Log("Beep");
yield return new WaitForSeconds(1f);
}
}Coroutine durduğunda alan kendiliğinden boşalmaz; bu nedenle alarm onu yeniden null olarak ayarlar ve sonraki Boşluk tuşu basışında hiçbir şeyin çalışmadığı anlaşılır. Doğru görünen iki yöntem işe yaramaz. StopCoroutine(Beep()), Beep()'i yeniden çağırır; bu da yeni, henüz başlatılmamış bir coroutine oluşturur ve onu durdurur, dolayısıyla alarm çalmaya devam eder. enabled = false ise betiğin Update() yöntemini kapatır, ancak coroutine'leri çalışmaya devam eder. Bir coroutine, başvurusu aracılığıyla veya StopAllCoroutines() ile durdurulduğunda, son satırına ulaştığında ya da GameObject'i SetActive(false) ile devre dışı bırakıldığında veya yok edildiğinde sona erer.
Görev
KolaySpace, Bomb'ın fitilini yakar: Fuse coroutine'i Fuse lit mesajını günlüğe yazar, fuseTime (3) saniye bekler, Boom mesajını günlüğe yazar ve bombayı yok eder. Tıklama bombanın fitilini söndürmelidir, ancak betiği kapatır ve bomba yine de patlar. Fitili söndürme işlemini düzelt:
- Fitil yanarken tıklamak onu durdurur ve
Defusedmesajını günlüğe yazar. Bomba yerinde kalır. - Daha sonra Space ile fitili yeniden yakabilirsin; bu kez tıklama olmazsa bomba 3 saniye sonra patlar.
Play'e bas, fitili yak, tıkla ve Console'u izle; ardından Check'e bas.
Kendin dene
using System.Collections;
using UnityEngine;
public class Bomb : MonoBehaviour
{
public float fuseTime = 3f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(Fuse());
}
if (Input.GetMouseButtonDown(0))
{
enabled = false;
Debug.Log("Defused");
}
}
IEnumerator Fuse()
{
Debug.Log("Fuse lit");
yield return new WaitForSeconds(fuseTime);
Debug.Log("Boom");
Destroy(gameObject);
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Fizik ve Oynanış bölümündeki tüm dersler
1Rigidbody
Yerçekimi ve KütleAddForce ile İtmeDürtüyle ZıplamaFizik için FixedUpdateHızKinematik CisimlerTekrar: Fırlatma Rampası4Coroutine'ler
ÇağırmaInvokeRepeating ve CancelInvokeİlk Coroutine'inizCoroutine'lerde DöngülerCoroutine'leri DurdurmaTekrar: Geri Sayım2Çarpışmalar
OnCollisionEnterNeye Çarptım?Çarpınca KırılYerde DurmakSekme ve SürtünmeCollider ŞekilleriTekrar: Kırılabilir Duvar