Menu
CoddyTech

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

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

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(), כשהיא מגיעה לשורה האחרונה שלה, או כשמבטלים את ההפעלה של ה-GameObject שלה באמצעות SetActive(false) או משמידים אותו.

challenge icon

אתגר

קל

גרמו ללחיצה לנטרל את הפצצה בלי לכבות את הסקריפט.

  1. הוסיפו שדה Coroutine fuse;. בלחיצה על Space, הציבו fuse = StartCoroutine(Fuse());.
  2. בלחיצה, החליפו את enabled = false;: כאשר fuse != null, קראו ל־StopCoroutine(fuse);, הציבו fuse = null; והציגו ביומן Defused.

לחצו על "שחק", לחצו על Space ואז לחצו: המסוף מציג Defused והפצצה נשארת. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

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

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

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