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.
Tantangan
MudahTulis Ride agar gerbang kisi melakukan satu perjalanan penuh.
- Tetapkan
Vector3 up = down + Vector3.up * height;.while (transform.position != up), gerakkan denganVector3.MoveTowards(transform.position, up, speed * Time.deltaTime)danyield return null;. - Catat
Open, laluyield return new WaitForSeconds(1f);. - Turunkan kembali ke
downdengan cara yang sama, lalu catatClosed.
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
1Rigidbody
Gravitasi dan MassaDorong dengan AddForceMelompat dengan ImpulsFixedUpdate untuk FisikaKecepatanBenda KinematikRingkasan: Landasan Peluncur4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine PertamamuPerulangan dalam CoroutineMenghentikan CoroutineRangkuman: Hitung Mundur10Proyek: Kabur dari Arena
ArenaPara Pemburu2Tabrakan
OnCollisionEnterApa yang Kutabrak?Pecah Saat BenturanBerdiri di Atas TanahPantulan dan GesekanBentuk ColliderRangkuman: Dinding yang Bisa HancurLatihan sendiri: Playground Unity