Menu
CoddyTech

הקורוטינה הראשונה שלך

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

על Update() להסתיים בכל פריים, ולכן הוא לא יכול להמתין. קורוטינה יכולה: זו מתודה שמשהה את פעולתה וממשיכה מאוחר יותר בדיוק מהמקום שבו נעצרה. היא מחזירה IEnumerator, שדורש using System.Collections;, וכל yield return בתוכה הוא השהיה. ב־C#, yield return יוצר מתודה שמוסרת את הערכים שלה בזה אחר זה; Unity מבקש את הערך הבא כשההמתנה מסתיימת. yield return null ממתין פריים אחד, ו־yield return new WaitForSeconds(3f) ממתין 3 שניות.

StartCoroutine(Cycle()) מתחיל קורוטינה. הרמזור הזה נדלק בירוק, עובר לצהוב כעבור 3 שניות, ולאדום כעבור שנייה נוספת:

using System.Collections;
using UnityEngine;

public class TrafficLight : MonoBehaviour
{
    Renderer lamp;

    void Start()
    {
        lamp = GetComponent<Renderer>();
        StartCoroutine(Cycle());
    }

    IEnumerator Cycle()
    {
        lamp.material.color = Color.green;
        yield return new WaitForSeconds(3f);
        lamp.material.color = Color.yellow;
        yield return new WaitForSeconds(1f);
        lamp.material.color = Color.red;
    }
}

StartCoroutine מריצה את הקורוטינה עד ל־yield הראשון שלה מיד, ואז Start() ממשיכה; Unity מחדשת את פעולתה אחרי כל המתנה, כשהמשתנים המקומיים שלה נשארים כפי שהיו. קריאה ל־Cycle(); בלי StartCoroutine לא עושה כלום: היא יוצרת את המתודה המושהית ומשליכה אותה, ואף שורה ממנה לא רצה. וגם yield return 3f; אינו ממתין 3 שניות: Unity מכירה רק אובייקטים של המתנה כמו WaitForSeconds, ומתייחסת לכל ערך אחר כאילו הוא פריים אחד.

challenge icon

אתגר

קל

גרום למלכודת הקוצים לקפוץ באמצעות מקש הרווח בעזרת קורוטינה.

  1. כתוב IEnumerator Spring(): רשום ביומן Click, ואז yield return new WaitForSeconds(0.5f);, ואז transform.position += Vector3.up;.
  2. לאחר מכן המתן 2 שניות באותה דרך והסר שוב את Vector3.up.
  3. בתוך if של מקש הרווח, הפעל אותה באמצעות StartCoroutine(Spring());.

לחץ על "שחק" ולחץ על מקש הרווח: הקוצים קופצים למעלה ואז שוקעים. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

using System.Collections;
using UnityEngine;

public class SpikeTrap : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // הפעל את המלכודת באמצעות קורוטינה
        }
    }

    // IEnumerator Spring(): השמע צליל נקישה, המתן 0.5 s, עלה 1 יחידה, המתן 2 s, רד 1 יחידה
}

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

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