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

انتهت اللعبة

الدرس 12 من 16 في دورة لعبة Unity: تحطيم الطوب على Coddy.

تنهي الحياة الأخيرة التي تُفقد اللعبة. تخرج الكرة من اللعب، وتغطي لوحة «انتهت اللعبة» الشاشة، ويبدأ زر «العب مجددًا» لعبة جديدة. يحتوي المشهد الآن على اللوحة، وهي مخفية داخل لوحة HUD، كما أن قائمة On Click الخاصة بالزر في Inspector تستدعي مسبقًا GameManager.PlayAgain. لا تعرض قائمة On Click إلا الطرق public، لذا يجب أن تكون الطريقة التي تختارها للزر عامة.

أبسط طريقة لبدء لعبة جديدة هي إعادة تحميل المشهد. يُنشأ كل كائن من جديد من المشهد: GameManager جديد بنتيجة 0 و3 حيوات، وجدار جديد، والكرة مجددًا على المضرب. المشهد الذي يجري تشغيله هو SceneManager.GetActiveScene()، ويمثل buildIndex رقمه في قائمة البناء:

SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);

يؤدي إخفاء الكرة باستخدام SetActive(false) إلى إيقاف Update() الخاص بها، فلا يعود بإمكان مفتاح المسافة إطلاقها، كما يخرجها ذلك من الفيزياء. يأتي الاختبار بعد lives--، لذا تنتهي اللعبة عندما تصل الأرواح إلى 0: أي عند فقدان الكرة الثالثة عندما تبدأ الأرواح عند 3.

challenge icon

التحدي

متوسط
  1. أضف using UnityEngine.SceneManagement; وpublic GameObject gameOverPanel إلى GameManager. يربط المشهد لوحة GameOverPanel المخفية.
  2. في BallLost، عند نفاد آخر حياة، أظهر اللوحة وأخفِ الكرة المفقودة باستخدام SetActive(false)، بدلًا من إعادتها إلى المضرب.
  3. اكتب public void PlayAgain()، لتحميل المشهد الجاري من جديد. يستدعي زر «العب مجددًا» في اللوحة هذه الدالة بالفعل.

اضغط العب، وافقد الكرات الثلاث، وانقر على العب مجددًا، ثم تحقّق.

جرّب بنفسك

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Brick brickPrefab;
    public Transform wall;
    public string[] levels;
    public float spacingX = 1.75f;
    public float spacingY = 0.75f;
    public float topY = 6f;

    public Ball ball;
    public int lives = 3;
    public TMP_Text scoreText;
    public TMP_Text livesText;

    int score;
    int level;
    int bricksLeft;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        BuildLevel(0);
        ShowHud();
    }

    void BuildLevel(int index)
    {
        level = index;
        string[] rows = levels[index].Split('/');
        for (int row = 0; row < rows.Length; row++)
        {
            string line = rows[row];
            float left = -(line.Length - 1) * spacingX / 2f;
            for (int col = 0; col < line.Length; col++)
            {
                char c = line[col];
                if (c == '.') continue;
                Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
                Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
                brick.SetHits(c - '0');
                bricksLeft++;
            }
        }
    }

    public void BrickBroken(Brick brick)
    {
        score += brick.points;
        bricksLeft--;
        ShowHud();
        if (bricksLeft == 0)
        {
            ball.ResetToPaddle();
            BuildLevel((level + 1) % levels.Length);
        }
    }

    public void BallLost(Ball lost)
    {
        lives--;
        ShowHud();
        lost.ResetToPaddle();
    }

    void ShowHud()
    {
        scoreText.text = "Score: " + score;
        livesText.text = "Lives: " + lives;
    }
}
quiz iconاختبر نفسك

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

جميع دروس لعبة Unity: تحطيم الطوب