Menu
CoddyTech

עצירת קורוטינות

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

הקריאה ל־StartCoroutine מחזירה Coroutine, ידית לקורוטינה שהיא התחילה. שמור אותה בשדה, ו־StopCoroutine(handle) עוצרת את הקורוטינה במקום שבו היא מושהית: השורות שאחרי yield שלה לעולם לא ירוצו. StopAllCoroutines() עוצרת כל קורוטינה שהסקריפט התחיל. מקש הרווח מפעיל ומכבה את האזעקה הזאת:

Coroutine beeping;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        if (beeping == null)
        {
            beeping = StartCoroutine(Beep());
        }
        else
        {
            StopCoroutine(beeping);
            beeping = null;
        }
    }
}

IEnumerator Beep()
{
    while (true)
    {
        Debug.Log("Beep");
        yield return new WaitForSeconds(1f);
    }
}

השדה לא מתרוקן מעצמו כשהקורוטינה נעצרת, לכן האזעקה מאפסת אותו ל־null, וכך לחיצה נוספת על מקש הרווח יודעת ששום דבר לא פועל. שתי דרכים שנראות נכונות לא עובדות. StopCoroutine(Beep()) קוראת שוב ל־Beep(), מה שיוצר קורוטינה חדשה שעדיין לא התחילה, ועוצרת אותה, כך שהאזעקה ממשיכה לצפצף. ו־enabled = false מכבה את Update() של הסקריפט, אבל הקורוטינות שלו ממשיכות לפעול. קורוטינה מסתיימת כשהיא נעצרת באמצעות הידית שלה או באמצעות StopAllCoroutines(), כשהיא מגיעה לשורה האחרונה שלה, או כשאובייקט המשחק שלה מושבת באמצעות SetActive(false) או מושמד.

challenge icon

אתגר

קל

לחיצה על Space מדליקה את הפתיל של Bomb: הקורוטינה Fuse רושמת ביומן Fuse lit, ממתינה fuseTime (3) שניות, רושמת ביומן Boom ומשמידה את הפצצה. לחיצה אמורה לנטרל אותה, אבל היא מכבה את הסקריפט, והפצצה עדיין מתפוצצת. תקנו את נטרול הפצצה:

  • לחיצה בזמן שהפתיל בוער עוצרת אותו ורושמת ביומן Defused. הפצצה נשארת.
  • לאחר מכן אפשר להדליק שוב את הפתיל בלחיצה על Space, והפעם, אם לא לוחצים, הפצצה מתפוצצת כעבור 3 שניות.

לחצו על Play, הדליקו את הפתיל, לחצו וצפו ב-Console, ואז לחצו על Check.

נסו בעצמכם

using System.Collections;
using UnityEngine;

public class Bomb : MonoBehaviour
{
    public float fuseTime = 3f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Fuse());
        }
        if (Input.GetMouseButtonDown(0))
        {
            enabled = false;
            Debug.Log("Defused");
        }
    }

    IEnumerator Fuse()
    {
        Debug.Log("Fuse lit");
        yield return new WaitForSeconds(fuseTime);
        Debug.Log("Boom");
        Destroy(gameObject);
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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