الإيقاف المؤقت باستخدام 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 أولًا.
التحدي
متوسطأضف قائمة إيقاف مؤقت إلى ملعب التنس. يربط المشهد زري الإيقاف المؤقت والاستئناف.
- في
PauseMenu.cs، تضبطPause()القيمةTime.timeScale = 0f;وتستدعيpanel.SetActive(true);. - تضبط
Resume()القيمةTime.timeScale = 1f;وتستدعيpanel.SetActive(false);. - في
BallMachine.cs، أضفif (Time.timeScale == 0f) return;قبل التحقق من مفتاح المسافة فيUpdate().
اضغط على «العب»، وأرسل الكرة ثم أوقف اللعبة مؤقتًا: ستبقى معلقة في الهواء. ثم اضغط على «تحقق».
جرّب بنفسك
using UnityEngine;
public class PauseMenu : MonoBehaviour
{
public GameObject panel;
public void Pause()
{
// أوقف وقت اللعبة وأظهر اللوحة
}
public void Resume()
{
// يعود وقت اللعبة إلى سرعته الطبيعية، وتُخفى اللوحة
}
}
جميع دروس إنشاء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارمنصات متحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك6مشروع: عدّاء لا نهاية له
ثلاثة مساراتعقبات أمامكتدرّب بنفسك: Playground لـ Unity