Menu
CoddyTech

الإيقاف المؤقت باستخدام timeScale

جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 34 من 60.

Time.timeScale تحدد سرعة مرور وقت اللعبة: القيمة 1 تعني السرعة الطبيعية، والقيمة 0 توقفه. عند القيمة 0، تصبح Time.deltaTime مساوية لـ 0، لذلك تتوقف كل حركة مكتوبة بالشكل speed * Time.deltaTime. ولن يعود استدعاء FixedUpdate()، لذا تبقى الأجسام الصلبة معلقة في الهواء، كما ينتظر كل من WaitForSeconds وInvoke، لأنهما يحسبان وقت اللعبة. يبدّل هذا النص البرمجي حالة الإيقاف المؤقت من زر تستدعي قائمة On Click فيه TogglePause، ويعرض لوحة أثناء الإيقاف المؤقت:

public class PauseToggle : MonoBehaviour
{
    public GameObject pausePanel;
    bool paused;

    public void TogglePause()
    {
        paused = !paused;
        Time.timeScale = paused ? 0f : 1f;
        pausePanel.SetActive(paused);
    }
}

لكن لا يتوقف كل شيء. يظل استدعاء Update() وLateUpdate() في كل إطار، وتكون قيمة Time.deltaTime هي 0، كما يستمر yield return null في coroutine بالعودة في الإطار التالي، وتظل واجهة المستخدم تستجيب للنقرات، وهذا ما يتيح للزر إنهاء الإيقاف المؤقت. وتظل المفاتيح تُقرأ أيضًا: فالضفدع الذي يقفز عند الضغط على Space في Update() سيستجيب للضغطة أثناء الإيقاف المؤقت ويقفز في أول خطوة فيزيائية بعد انتهائه. يتجاهل نصه البرمجي ضغطات المفاتيح عندما يكون الوقت متوقفًا:

void Update()
{
    if (Time.timeScale == 0f) return;   // متوقف مؤقتًا: تجاهل المفاتيح
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
    }
}

ينطبق Time.timeScale على اللعبة كلها، لا على مشهد واحد: إذا حمّلت مشهدًا آخر بينما قيمته 0، فسيبدأ المشهد الجديد متوقفًا مؤقتًا. ويعيد زر في القائمة تشغيل المستوى أو إنهاءه ضبط القيمة إلى 1 أولًا.

challenge icon

التحدي

متوسط

أضف قائمة إيقاف مؤقت إلى ملعب التنس. يربط المشهد زري الإيقاف المؤقت والاستئناف.

  1. في PauseMenu.cs، تضبط Pause() القيمة Time.timeScale = 0f; وتستدعي panel.SetActive(true);.
  2. تضبط Resume() القيمة Time.timeScale = 1f; وتستدعي panel.SetActive(false);.
  3. في BallMachine.cs، أضف if (Time.timeScale == 0f) return; قبل التحقق من مفتاح المسافة في Update().

اضغط على «العب»، وأرسل الكرة ثم أوقف اللعبة مؤقتًا: ستبقى معلقة في الهواء. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;

public class PauseMenu : MonoBehaviour
{
    public GameObject panel;

    public void Pause()
    {
        // أوقف وقت اللعبة وأظهر اللوحة
    }

    public void Resume()
    {
        // يعود وقت اللعبة إلى سرعته الطبيعية، وتُخفى اللوحة
    }
}

جميع دروس إنشاء ألعاب حقيقية

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