Menu
CoddyTech

לולאות בקורוטינות

חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 25 מתוך 71.

לולאה עם yield return בתוכה פועלת לאורך פריימים רבים, כי כל איטרציה מושהית לפני הבאה. עם WaitForSeconds הלולאה חוזרת על משהו בקצב קבוע. הצופר הזה מהבהב 3 פעמים:

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 הלולאה עושה קצת בכל פריים עד שהתנאי שלה מתקיים, וכך קורוטינה מנפישה משהו. הבלון הזה, בקנה מידה של 1, גדל ב־0.5 לשנייה עד שקנה המידה שלו מגיע ל־2, ואז מדווח:

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

Time.deltaTime פועל כאן כמו ב־Update(): הקורוטינה מתחדשת פעם אחת בכל פריים, והשורה שאחרי הלולאה מתבצעת רק כשהלולאה מסתיימת. בלי yield, הלולאה כולה רצה בתוך פריים אחד והבלון מתנפח לגמרי מיד. לולאת while (true) מתאימה בקורוטינה כל עוד היא משהה את הביצוע בכל איטרציה; בלי השהיה היא לעולם לא מחזירה את השליטה לפריים, ועורך Unity קופא.

challenge icon

אתגר

קל

כתבו את Ride כך ששער הסורג יעבור מסלול מלא אחד.

  1. הגדירו Vector3 up = down + Vector3.up * height;. כל עוד מתקיים while (transform.position != up), הזיזו אותו באמצעות Vector3.MoveTowards(transform.position, up, speed * Time.deltaTime) והשתמשו ב-yield return null;.
  2. רשמו ביומן Open, ואז השתמשו ב-yield return new WaitForSeconds(1f);.
  3. הורידו אותו בחזרה אל down באותה הדרך, ואז רשמו ביומן Closed.

לחצו על „שחק” ולחצו על מקש הרווח: השער עולה, ממתין ונסגר. לאחר מכן לחצו על „בדיקה”.

נסו בעצמכם

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()
    {
        // עלה ב-height יחידות במהירות speed וכתוב ללוג Open, הישאר למשך 1 שנייה, רד בחזרה וכתוב ללוג Closed
        yield return null;
    }
}

כל השיעורים ביחידה פיזיקה ומשחקיות

תרגלו בעצמכם: Unity אונליין