Menu
CoddyTech

InvokeRepeating, CancelInvoke

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

يستدعي InvokeRepeating(nameof(Blink), 0.5f, 0.5f) الدالة Blink لأول مرة بعد 0.5 ثانية، ثم يستدعيها مجددًا كل 0.5 ثانية حتى يُلغى الاستدعاء. الرقم الأول هو التأخير قبل الاستدعاء الأول، والثاني هو المدة بين الاستدعاءات. يوقفها CancelInvoke(nameof(Blink))، أما CancelInvoke() من دون اسم فيوقف كل استدعاء Invoke حجزه البرنامج النصي.

يومض مصباح التحذير هذا حتى تضغط على Space، ثم يبقى مضاءً:

Light lamp;

void Start()
{
    lamp = GetComponent<Light>();
    InvokeRepeating(nameof(Blink), 0.5f, 0.5f);
}

void Blink()
{
    lamp.enabled = !lamp.enabled;
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        CancelInvoke(nameof(Blink));
        lamp.enabled = true;
    }
}

كان المؤقت من فصل إنشاء العناصر سيؤدي المهمة نفسها باستخدام حقل float وفحص داخل Update(). مع InvokeRepeating، تتولى Unity متابعة الوقت وإجراء الاستدعاءات. يوضع الاستدعاء InvokeRepeating داخل Start(): فلو وضعته داخل Update()، لحجز استدعاءً متكررًا إضافيًا في كل إطار.

challenge icon

التحدي

سهل

اجعل النافورة الحارة تثور ثلاث مرات وفق جدول زمني.

  1. في Start()، استدعِ InvokeRepeating(nameof(Erupt), 1f, 2f);.
  2. اكتب void Erupt(): أضف 1 إلى eruptions، واستدعِ ball.AddForce(Vector3.up * power, ForceMode.Impulse); وسجّل "Eruption " + eruptions.
  3. في نهاية Erupt()، عندما تكون eruptions == 3، استدعِ CancelInvoke(nameof(Erupt));.

اضغط «العب»: ستُقذف الكرة إلى الأعلى ثلاث مرات، بفاصل ثانيتين. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;

public class Geyser : MonoBehaviour
{
    public Rigidbody ball;
    public float power = 6f;
    int eruptions;

    void Start()
    {
        // أطلق الثوران بعد 1 ثانية من Play، ثم كل 2 ثانية
    }

    // Erupt(): احسب عدد مرات الثوران، وادفع الكرة إلى الأعلى، وسجّل ذلك؛ توقّف بعد المرة الثالثة
}

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

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