Menu
CoddyTech

أول Coroutine لك

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

يجب أن تنتهي Update() في كل إطار، لذا لا يمكنها الانتظار. لكن الروتين المشترك يمكنه ذلك: فهو دالة تتوقف مؤقتًا ثم تتابع لاحقًا من حيث توقفت. وتُرجع IEnumerator، ما يتطلب using System.Collections;، وكل yield return فيها يمثّل توقفًا مؤقتًا. في C#، تجعل yield return الدالة تسلّم قيمها واحدة تلو الأخرى؛ وتطلب Unity القيمة التالية عند انتهاء الانتظار. ينتظر yield return null إطارًا واحدًا، بينما ينتظر yield return new WaitForSeconds(3f) مدة 3 ثوانٍ.

يبدأ StartCoroutine(Cycle()) روتينًا مشتركًا. يتحول ضوء المرور هذا إلى الأخضر، ثم إلى الأصفر بعد 3 ثوانٍ، ثم إلى الأحمر بعد ثانية أخرى:

using System.Collections;
using UnityEngine;

public class TrafficLight : MonoBehaviour
{
    Renderer lamp;

    void Start()
    {
        lamp = GetComponent<Renderer>();
        StartCoroutine(Cycle());
    }

    IEnumerator Cycle()
    {
        lamp.material.color = Color.green;
        yield return new WaitForSeconds(3f);
        lamp.material.color = Color.yellow;
        yield return new WaitForSeconds(1f);
        lamp.material.color = Color.red;
    }
}

ينفّذ StartCoroutine الروتين المشترك حتى أول yield فورًا، ثم تتابع Start() عملها؛ وتستأنفه Unity بعد كل انتظار، مع بقاء متغيراته المحلية كما كانت. أما Cycle(); وحدها، من دون StartCoroutine، فلا تفعل شيئًا: فهي تنشئ الدالة المتوقفة مؤقتًا ثم تتخلّص منها، ولا يُنفّذ منها أي سطر. كذلك، فإن yield return 3f; لا ينتظر 3 ثوانٍ: لا تعرف Unity سوى كائنات الانتظار مثل WaitForSeconds، وتتعامل مع أي قيمة أخرى على أنها إطار واحد.

challenge icon

التحدي

سهل

اجعل فخ الأشواك يقفز عند الضغط على مفتاح المسافة باستخدام coroutine.

  1. اكتب IEnumerator Spring(): سجّل Click، ثم yield return new WaitForSeconds(0.5f);، ثم transform.position += Vector3.up;.
  2. انتظر بعد ذلك ثانيتين بالطريقة نفسها، ثم أزِل Vector3.up مرة أخرى.
  3. داخل شرط if الخاص بمفتاح المسافة، ابدأها باستخدام StartCoroutine(Spring());.

اضغط على «العب» ثم اضغط على مفتاح المسافة: تقفز الأشواك إلى الأعلى، ثم تهبط. ثم اضغط على «تحقق».

جرّب بنفسك

using System.Collections;
using UnityEngine;

public class SpikeTrap : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // فعّل الفخ باستخدام coroutine
        }
    }

    // IEnumerator Spring(): انقر، انتظر 0.5 s، اصعد 1 وحدة، انتظر 2 s، انزل 1 وحدة
}

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

تدرّب بنفسك: Playground لـ Unity