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.
Tantangan
MudahSpace 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);
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Fisika dan Gameplay
1Rigidbody
Gravitasi dan MassaDorong dengan AddForceMelompat dengan ImpulsFixedUpdate untuk FisikaKecepatanBenda KinematikRingkasan: Landasan Peluncur4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine PertamamuPerulangan dalam CoroutineMenghentikan CoroutineRangkuman: Hitung Mundur2Tabrakan
OnCollisionEnterApa yang Kutabrak?Pecah Saat BenturanBerdiri di Atas TanahPantulan dan GesekanBentuk ColliderRangkuman: Dinding yang Bisa Hancur