Menu
CoddyTech

Perulangan dalam Coroutine

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

Perulangan yang di dalamnya terdapat yield return berjalan selama banyak frame, karena setiap iterasi berhenti sejenak sebelum iterasi berikutnya. Dengan WaitForSeconds, perulangan mengulang sesuatu secara berkala. Sirene ini berkedip 3 kali:

IEnumerator Flash()
{
    for (int i = 0; i < 3; i++)
    {
        lamp.enabled = true;
        yield return new WaitForSeconds(0.2f);
        lamp.enabled = false;
        yield return new WaitForSeconds(0.2f);
    }
}

Dengan yield return null, perulangan melakukan sedikit pekerjaan pada setiap frame hingga kondisinya terpenuhi. Begitulah coroutine menganimasikan sesuatu. Balon ini, dengan skala 1, membesar 0.5 per detik hingga skalanya mencapai 2, lalu menampilkan:

IEnumerator Inflate()
{
    while (transform.localScale.x < 2f)
    {
        transform.localScale += Vector3.one * 0.5f * Time.deltaTime;
        yield return null;
    }
    Debug.Log("Full");
}

Time.deltaTime bekerja di sini seperti pada Update(): coroutine dilanjutkan sekali setiap frame, dan baris setelah perulangan hanya dijalankan setelah perulangan selesai. Tanpa yield, seluruh perulangan berjalan dalam satu frame dan balon langsung penuh. Perulangan while (true) boleh digunakan dalam coroutine selama perulangan tersebut melakukan yield pada setiap iterasi. Tanpa yield, coroutine tidak pernah mengembalikan kendali ke frame, sehingga editor Unity membeku.

challenge icon

Tantangan

Mudah

Tombol Space memulai coroutine Ride pada gerbang Portcullis kastel. Tulis Ride agar gerbang melakukan satu perjalanan penuh:

  • Gerbang naik setinggi height (3) unit dengan speed (1.5) unit per detik, berhenti tepat di bagian atas, lalu mencatat Open.
  • Gerbang tetap terbuka selama 1 detik.
  • Gerbang turun kembali dengan kecepatan yang sama ke tempatnya semula (down), lalu mencatat Closed.

Tekan Play dan tekan Space, lalu Periksa.

Coba sendiri

using System.Collections;
using UnityEngine;

public class Portcullis : MonoBehaviour
{
    public float speed = 1.5f;
    public float height = 3f;
    Vector3 down;

    void Start()
    {
        down = transform.position;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Ride());
        }
    }

    IEnumerator Ride()
    {
        // Naik setinggi height satuan dengan kecepatan speed dan catat Open, tunggu 1 detik, lalu turun kembali dan catat Closed
        yield return null;
    }
}
quiz iconUji dirimu

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

Semua pelajaran di Fisika dan Gameplay