Menu
CoddyTech

إعادة تشغيل المستوى

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

أسرع طريقة لإعادة ضبط مستوى هي تحميله مرة أخرى. تعيد SceneManager.GetActiveScene() المشهد المفتوح الآن، واسمه name (أو buildIndex) هو ما يأخذه LoadScene. يستدعي زر إعادة التشغيل هذا في لوحة انتهاء اللعبة:

public void Restart()
{
    SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}

تحذف Unity المشهد المفتوح وتنشئه من جديد من ملف المشهد. يعود كل كائن إلى الموضع الذي حدده له المشهد، بما في ذلك الصندوق الذي أسقطه اللاعب، وتعود قيمة Inspector لكل حقل، ويُشغَّل Awake وStart من جديد. لا حاجة إلى كتابة أي كود لإعادة الأشياء واحدًا تلو الآخر. ولأن الزر يطلب المشهد النشط بدلًا من اسم مثل "Level3"، يعيد النص البرمجي نفسه تشغيل أي مستوى يوضع فيه.

الحقل static ليس جزءًا من المشهد: فهو يتبع الفئة، لذا تتركه إعادة التحميل كما كان. يحتفظ private static float bestTime; بأفضل وقت عبر مرات إعادة التشغيل، بينما يبدأ private float time; العادي من جديد من 0 مع المشهد الجديد. كما أن GameManager.Instance ثابت؛ فبعد إعادة التحميل، يظل يشير إلى GameManager الذي دُمّر حتى تعيّنه Awake الخاص بالنسخة الجديدة.

challenge icon

التحدي

سهل

ينبغي أن تؤدي السقطة إلى إعادة بدء المستوى الذي يوجد فيه اللاعب وإحصاء السقطة.

  1. أضف using UnityEngine.SceneManagement; وغيّر العداد إلى private static int falls;، حتى يحتفظ بقيمته عند إعادة تحميل المستوى.
  2. في Update()، عندما يكون player.position.y < fallY، نفّذ falls++; وحمّل SceneManager.GetActiveScene().name.

اضغط على «العب» وامشِ عن حافة في كلا المستويين: Falls: 1، ثم Falls: 2. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;
using TMPro;

public class LevelRestart : MonoBehaviour
{
    public Transform player;
    public TMP_Text fallsText;
    public float fallY = -3f;
    private int falls;

    void Start()
    {
        fallsText.text = "Falls: " + falls;
    }

    void Update()
    {
        // عند النزول تحت fallY: احسب السقوط وأعد تشغيل المستوى الذي يوجد فيه اللاعب
    }
}

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

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