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

الحلقات داخل الكوروتينات

جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 24 من 63.

تعمل الحلقة التي تحتوي على yield return بداخلها عبر العديد من الإطارات، لأن كل دورة تتوقف مؤقتًا قبل التالية. باستخدام WaitForSeconds تكرّر الحلقة شيئًا بإيقاع منتظم. يومض هذا المنبّه 3 مرات:

IEnumerator Flash()
{
    for (int i = 0; i < 3; i++)
    {
        lamp.enabled = true;
        yield return new WaitForSeconds(0.2f);
        lamp.enabled = false;
        yield return new WaitForSeconds(0.2f);
    }
}

باستخدام yield return null تنفّذ الحلقة شيئًا صغيرًا في كل إطار حتى يتحقق شرطها، وهذه هي الطريقة التي تحرّك بها coroutine شيئًا ما. يكبر هذا البالون، الذي مقياسه 1، بمقدار 0.5 في الثانية حتى يصل مقياسه إلى 2، ثم يعرض رسالة:

IEnumerator Inflate()
{
    while (transform.localScale.x < 2f)
    {
        transform.localScale += Vector3.one * 0.5f * Time.deltaTime;
        yield return null;
    }
    Debug.Log("Full");
}

تعمل Time.deltaTime هنا كما في Update(): تُستأنف coroutine مرة واحدة في كل إطار، ولا يُنفّذ السطر الذي يلي الحلقة إلا عند انتهائها. من دون yield، تعمل الحلقة بأكملها في إطار واحد ويصبح البالون ممتلئًا فورًا. لا بأس باستخدام حلقة while (true) في coroutine ما دامت تُنفّذ yield في كل دورة؛ فمن دون yield لا تعيد الإطار، ويتجمّد محرر Unity.

challenge icon

التحدي

سهل

يبدأ الضغط على مفتاح المسافة coroutine Ride الخاص ببوابة القلعة Portcullis. اكتب Ride بحيث تقوم البوابة برحلة كاملة واحدة:

  • ترتفع بمقدار height (3) وحدات بسرعة speed (1.5) وحدة في الثانية، وتتوقف تمامًا عند الأعلى وتسجل Open.
  • تبقى مفتوحة لمدة ثانية واحدة.
  • تنزل بالسرعة نفسها إلى موضع بدايتها (down) وتسجل Closed.

اضغط Play ثم اضغط مفتاح المسافة، وبعدها Check.

جرّب بنفسك

using System.Collections;
using UnityEngine;

public class Portcullis : MonoBehaviour
{
    public float speed = 1.5f;
    public float height = 3f;
    Vector3 down;

    void Start()
    {
        down = transform.position;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Ride());
        }
    }

    IEnumerator Ride()
    {
        // ارتفع بمقدار height وحدة بسرعة speed وسجّل Open، وانتظر 1 ثانية، ثم عُد إلى الأسفل وسجّل Closed
        yield return null;
    }
}
quiz iconاختبر نفسك

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

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