Menu
CoddyTech

Coroutine'lerde Döngüler

Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 24 / 63.

İçinde yield return bulunan bir döngü birçok kare boyunca çalışır, çünkü her yineleme bir sonrakinden önce duraklar. WaitForSeconds ile döngü bir şeyi belirli aralıklarla tekrarlar. Bu siren 3 kez yanıp söner:

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);
    }
}

yield return null ile döngü, koşulu sağlanana kadar her karede biraz ilerler; bir coroutine'in bir şeyi canlandırması bu şekilde olur. Ölçeği 1 olan bu balon, ölçeği 2'ye ulaşana kadar saniyede 0.5 büyür, ardından şunu bildirir:

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

Time.deltaTime burada Update() içindeki gibi çalışır: coroutine her karede bir kez devam eder ve döngüden sonraki satır yalnızca döngü tamamlandığında çalışır. yield olmadan tüm döngü tek bir kare içinde çalışır ve balon anında dolar. Her yinelemede yield ettiği sürece, coroutine içinde while (true) döngüsü kullanmak uygundur; yield etmezse kareyi asla geri vermez ve Unity editörü donar.

challenge icon

Görev

Kolay

Space tuşu, kalenin Portcullis'inin Ride coroutine'ini başlatır. Kapının tam bir tur yapmasını sağlayacak şekilde Ride yaz:

  • height (3) birim yükselir; saniyede speed (1.5) birim hızla ilerler, tam tepe noktasında durur ve Open mesajını kaydeder.
  • 1 saniye açık kalır.
  • Aynı hızla başladığı yere (down) geri iner ve Closed mesajını kaydeder.

Play'e bas ve Space tuşuna bas, ardından Check'e bas.

Kendin dene

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()
    {
        // speed hızında height birim yüksel ve Open değerini logla, 1 saniye bekle, tekrar aşağı in ve Closed değerini logla
        yield return null;
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Fizik ve Oynanış bölümündeki tüm dersler