Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Komut dosyasını kapatmadan bir tıklamayla bombayı etkisiz hâle getir.

  1. Coroutine fuse; alanını ekle. Boşluk tuşuna basıldığında fuse = StartCoroutine(Fuse()); ayarla.
  2. Tıklandığında enabled = false; ifadesini değiştir: fuse != null olduğunda StopCoroutine(fuse); çağır, fuse = null; ayarla ve Defused mesajı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

Kendi başına pratik yap: Unity playground