Menu
CoddyTech
flag Ar iconالعربيةdown icon

إيقاف الكوروتينات

جزء من قسم الفيزياء وأسلوب اللعب في رحلة 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

التحدي

سهل

يضرم مفتاح المسافة فتيل Bomb: تسجّل coroutine Fuse الرسالة Fuse lit، وتنتظر fuseTime (3) ثوانٍ، ثم تسجّل Boom وتدمّر القنبلة. من المفترض أن يؤدي النقر إلى إبطال مفعولها، لكنه يوقف تشغيل البرنامج النصي، ومع ذلك تنفجر القنبلة. أصلح إبطال المفعول:

  • يؤدي النقر أثناء احتراق الفتيل إلى إيقافه وتسجيل Defused. تبقى القنبلة.
  • بعد ذلك، يمكن لمفتاح المسافة إشعال الفتيل مجددًا، وهذه المرة، إذا لم يحدث أي نقر، تنفجر القنبلة بعد 3 ثوانٍ.

اضغط على تشغيل، وأشعل الفتيل، وانقر، وراقب وحدة التحكم، ثم اضغط على تحقق.

جرّب بنفسك

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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الفيزياء وأسلوب اللعب