Menu
CoddyTech

Menghentikan Coroutine

Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 25 dari 63.

StartCoroutine mengembalikan Coroutine, yaitu penunjuk ke coroutine yang dimulainya. Simpan penunjuk itu dalam sebuah field, lalu StopCoroutine(handle) menghentikan coroutine tersebut di bagian tempat coroutine itu dijeda: baris-baris setelah yield tidak akan pernah dijalankan. StopAllCoroutines() menghentikan semua coroutine yang dimulai oleh skrip. Tombol Space menyalakan dan mematikan alarm ini:

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);
    }
}

Field tidak mengosongkan dirinya sendiri saat coroutine berhenti, jadi alarm mengaturnya kembali ke null, dan tombol Space berikutnya mengetahui bahwa tidak ada yang sedang berjalan. Dua cara yang tampak benar ternyata tidak berhasil. StopCoroutine(Beep()) memanggil Beep() lagi, yang membuat coroutine baru yang belum dimulai, lalu menghentikan coroutine tersebut, sehingga alarm terus berbunyi. Selain itu, enabled = false menonaktifkan Update() skrip, tetapi coroutine-nya terus berjalan. Coroutine berakhir saat dihentikan melalui penunjuknya atau dengan StopAllCoroutines(), saat mencapai baris terakhirnya, atau saat GameObject-nya dinonaktifkan dengan SetActive(false) atau dihancurkan.

challenge icon

Tantangan

Mudah

Space menyalakan sumbu Bomb: coroutine Fuse mencatat Fuse lit, menunggu fuseTime (3) detik, mencatat Boom, lalu menghancurkan bom. Seharusnya satu klik menjinakkannya, tetapi klik itu mematikan skrip, dan bom tetap meledak. Perbaiki proses penjinakannya:

  • Klik saat sumbu terbakar menghentikannya dan mencatat Defused. Bom tetap ada.
  • Setelah itu, Space dapat menyalakan sumbu lagi. Kali ini, jika tidak ada klik, bom akan meledak 3 detik kemudian.

Tekan Play, nyalakan sumbu, klik, dan amati Console, lalu tekan Periksa.

Coba sendiri

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);
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Fisika dan Gameplay