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.
Tantangan
MudahTombol Space memulai coroutine Ride pada gerbang Portcullis kastel. Tulis Ride agar gerbang melakukan satu perjalanan penuh:
- Gerbang naik setinggi
height(3) unit denganspeed(1.5) unit per detik, berhenti tepat di bagian atas, lalu mencatatOpen. - Gerbang tetap terbuka selama 1 detik.
- Gerbang turun kembali dengan kecepatan yang sama ke tempatnya semula (
down), lalu mencatatClosed.
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;
}
}
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