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

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

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

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 في الروتين المشترك تعود في الإطار التالي، كما تظل واجهة المستخدم تستجيب للنقرات، وهذا ما يتيح للزر إنهاء الإيقاف المؤقت. وتظل قراءة المفاتيح ممكنة أيضًا: فالضفدع الذي يقفز عند الضغط على 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

التحدي

متوسط

تدور آلة الكرات في ملعب التنس باستخدام السهمين الأيسر والأيمن، وتقذف كرة عند الضغط على مفتاح المسافة (BallMachine.cs). أضف إلى الملعب قائمة إيقاف مؤقت في PauseMenu.cs. يربط المشهد زر Pause بالدالة Pause()، وزر Resume، الموجود على PausePanel المخفي، بالدالة Resume()؛ ويضع Inspector اللوحة في panel.

  • توقف Pause() وقت اللعبة وتُظهر اللوحة.
  • تعيد Resume() وقت اللعبة إلى سرعته الطبيعية وتُخفي اللوحة.
  • في BallMachine.cs، يجب ألا تقذف ضغطة مفتاح المسافة كرة أثناء إيقاف اللعبة مؤقتًا. لا يحتاج الدوران إلى تغيير: فهو مكتوب باستخدام Time.deltaTime.

اضغط Play، واقذف كرة وأوقفها مؤقتًا في منتصف الهواء، ثم اضغط Check.

جرّب بنفسك

using UnityEngine;

public class PauseMenu : MonoBehaviour
{
    public GameObject panel;

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

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

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

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