انتهت اللعبة
الدرس 13 من 19 في دورة لعبة 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.
التحدي
متوسطيؤدي فقدان آخر حياة إلى إنهاء اللعبة، ويبدأ «العب مرة أخرى» من جديد.
- في
GameManager، أضفusing UnityEngine.SceneManagement;وpublic GameObject gameOverPanel; - في BallLost، عندما تكون
lives == 0، أظهر اللوحة وأخفِ الكرة باستخدامlost.gameObject.SetActive(false)؛ وإلا فأعِد ضبطها كما سبق. - اكتب
public void PlayAgain():SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
اضغط «العب»، وافقد ثلاث كرات، ثم انقر «العب مرة أخرى»: ستبدأ لعبة جديدة. ثم اضغط «تحقق».
جرّب بنفسك
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;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس لعبة Unity: كاسر الطوب
تدرّب بنفسك: Playground لـ Unity