Menu
CoddyTech

Coroutine'lerde Döngüler

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

İç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 küçük bir işlem yapar; coroutine ile bir şeyin canlandırılması böyle gerçekleşir. Ö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 verdiği sürece coroutine içinde while (true) döngüsü kullanmak uygundur; yield olmadan kareyi asla geri vermez ve Unity düzenleyicisi donar.

challenge icon

Görev

Kolay

Kapı kafesinin tam bir gidiş-dönüş yapması için Ride yaz.

  1. Vector3 up = down + Vector3.up * height; ayarla. while (transform.position != up) koşulunda Vector3.MoveTowards(transform.position, up, speed * Time.deltaTime) ile hareket et ve yield return null; kullan.
  2. Open kaydını tut, ardından yield return new WaitForSeconds(1f); kullan.
  3. Aynı şekilde down noktasına geri dönmek için döngü kur, ardından Closed kaydını tut.

“Oyna” düğmesine bas ve Space tuşuna bas: kapı yükselir, bekler ve kapanır. Ardından “Kontrol et” düğmesine 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 mesajını günlüğe yaz, 1 saniye bekle, sonra tekrar aşağı in ve Closed mesajını günlüğe yaz
        yield return null;
    }
}

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

Kendi başına pratik yap: Unity playground