Menu
CoddyTech

Perulangan dalam Coroutine

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

Perulangan dengan yield return di dalamnya berjalan selama banyak frame, karena setiap putaran berhenti sejenak sebelum putaran berikutnya. Dengan WaitForSeconds, perulangan mengulang sesuatu mengikuti irama. 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 sampai kondisinya terpenuhi, begitulah coroutine menganimasikan sesuatu. Balon ini, dengan skala 1, bertambah 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 berfungsi di sini seperti pada Update(): coroutine dilanjutkan sekali setiap frame, dan baris setelah perulangan hanya dijalankan saat perulangan selesai. Tanpa yield, seluruh perulangan berjalan dalam satu frame dan balon langsung penuh. Perulangan while (true) boleh digunakan dalam coroutine asalkan menghasilkan yield pada setiap putaran; tanpa yield, perulangan tidak pernah mengembalikan kendali ke frame, dan editor Unity akan membeku.

challenge icon

Tantangan

Mudah

Tulis Ride agar gerbang kisi melakukan satu perjalanan penuh.

  1. Tetapkan Vector3 up = down + Vector3.up * height;. while (transform.position != up), gerakkan dengan Vector3.MoveTowards(transform.position, up, speed * Time.deltaTime) dan yield return null;.
  2. Catat Open, lalu yield return new WaitForSeconds(1f);.
  3. Turunkan kembali ke down dengan cara yang sama, lalu catat Closed.

Tekan tombol “Main” dan tekan Space: gerbang naik, menunggu, lalu menutup. Kemudian tekan tombol “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 unit dengan kecepatan speed dan catat Open, tunggu 1 detik, lalu turun kembali dan catat Closed
        yield return null;
    }
}

Semua pelajaran di Fisika dan Gameplay

Latihan sendiri: Playground Unity