Coroutine'leri Durdurma
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 26 / 71.
StartCoroutine, başlattığı coroutine'i tanımlayan bir Coroutine döndürür. Bunu bir alanda sakla; StopCoroutine(handle), coroutine'i duraklatıldığı yerde durdurur: yield satırından sonraki satırlar hiçbir zaman çalışmaz. StopAllCoroutines(), betiğin başlattığı tüm coroutine'leri durdurur. Space 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 yüzden alarm alanı tekrar null yapar ve bir sonraki Space tuşu, çalışan bir şey olmadığını anlar. Doğru gibi görünen iki yöntem işe yaramaz. StopCoroutine(Beep()), Beep()'i yeniden çağırır; bu da hiç başlatılmamış yeni bir coroutine oluşturur ve onu durdurur, dolayısıyla alarm çalmaya devam eder. Ayrıca enabled = false, betiğin Update() işlevini kapatır ama coroutine'leri çalışmaya devam eder. Bir coroutine, tanıtıcısı 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
KolayKomut dosyasını kapatmadan bir tıklamayla bombayı etkisiz hâle getir.
Coroutine fuse;alanını ekle. Boşluk tuşuna basıldığındafuse = StartCoroutine(Fuse());ayarla.- Tıklandığında
enabled = false;ifadesini değiştir:fuse != nullolduğundaStopCoroutine(fuse);çağır,fuse = null;ayarla veDefusedmesajını günlüğe yaz.
“Oyna” düğmesine bas, Boşluk tuşuna bas, ardından tıkla: Konsol Defused mesajını gösterir ve bomba olduğu yerde kalır. Ardından “Kontrol et” düğmesine 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);
}
}
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 DuvarKendi başına pratik yap: Unity playground