إيقاف الكوروتينات
جزء من قسم الفيزياء وأسلوب اللعب في رحلة 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) أو تدميره.
التحدي
سهلاجعل النقر يزيل فتيل القنبلة دون إيقاف تشغيل البرنامج النصي.
- أضف حقلًا
Coroutine fuse;. عند الضغط على Space، عيّنfuse = StartCoroutine(Fuse());. - عند النقر، استبدل
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);
}
}
جميع دروس الفيزياء وأسلوب اللعب
1الجسم الصلب (Rigidbody)
الجاذبية والكتلةالدفع باستخدام AddForceالقفز باستخدام دفعةFixedUpdate للفيزياءالسرعة المتجهةالأجسام الحركيةمراجعة: منصة الإطلاق4الكوروتينات
InvokeInvokeRepeating, CancelInvokeأول Coroutine لكالحلقات داخل الكوروتيناتإيقاف الكوروتيناتمراجعة: العد التنازلي10المشروع: الهروب من الحلبة
الحلبةالصيادونتدرّب بنفسك: Playground لـ Unity