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

إكمال المستوى

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

تحتاج اللعبة ذات المستويات إلى طريقة لتدوينها. النص هو الأسهل: حرف واحد لكل طوبة، وسلسلة نصية واحدة لكل صف. في هذه اللعبة، الرقم هو طوبة لها ذلك العدد من الضربات، والنقطة فراغ، وتُكتب صفوف المستوى في سلسلة نصية واحدة، مفصولة بـ /، بحيث يتسع المستوى في سطر واحد في Inspector. تقسم Split('/') السلسلة النصية إلى مصفوفة من الصفوف. حديقة مزروعة انطلاقًا من نص:

string layout = "t.t.t/.ttt.";
string[] rows = layout.Split('/');
for (int row = 0; row < rows.Length; row++)
    for (int col = 0; col < rows[row].Length; col++)
        if (rows[row][col] == 't') Instantiate(treePrefab, new Vector3(col, 0f, -row), Quaternion.identity);

حرف الرقم ليس قيمته العددية: '3' هو محرف قيمته الرمزية 51. قيم الرموز للأرقام العشرة متتالية، لذا فإن طرح '0' (قيمته الرمزية 48) يعطي العدد: '3' - '0' هو العدد الصحيح 3.

يُكتمل المستوى عندما تنكسر آخر طوبة فيه. عُدّ الطوب: أضف واحدًا لكل طوبة تُبنى، واطرح واحدًا لكل طوبة تنكسر، وعند الوصول إلى 0 ينتهي المستوى. لا ينجح عدّ الطوب الذي لا يزال في المشهد في تلك اللحظة، لأن Destroy ينتظر حتى نهاية الإطار، لذا تظل الطوبة التي تنكسر موجودة.

challenge icon

التحدي

متوسط

أنشئ الطوب من النص. يملأ المشهد levels بثلاثة تخطيطات؛ الأول هو الجدار الموجود لديك الآن.

  1. في GameManager، أزل rows وcolumns وrowHits. أضف public string[] levels وpublic Ball ball (يربط المشهد الكرة)، وint level وint bricksLeft.
  2. استبدل BuildWall() بـ void BuildLevel(int index): يخزّن index في level ويقسّم levels[index] إلى صفوف عند /. لكل رقم c، ينشئ طوبة بعدد ضربات c - '0' ويضيف واحدًا إلى bricksLeft؛ وتبقى النقاط فارغة. تُوسّط الصفوف وتُباعد كما في السابق. يستدعي Start() الدالة BuildLevel(0).
  3. في BrickBroken، أنقص واحدًا من bricksLeft. عند وصوله إلى 0، أعد الكرة إلى المضرب وأنشئ المستوى التالي؛ وبعد آخر مستوى، ابدأ بالأول مجددًا.

اضغط Play وحاول إنهاء مستوى، ثم اضغط Check.

جرّب بنفسك

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Brick brickPrefab;
    public Transform wall;
    public int rows = 5;
    public int columns = 9;
    public float spacingX = 1.75f;
    public float spacingY = 0.75f;
    public float topY = 6f;
    public int[] rowHits = { 2, 1, 1, 1, 1 };
    public int lives = 3;
    public TMP_Text scoreText;
    public TMP_Text livesText;

    int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        BuildWall();
        ShowHud();
    }

    void BuildWall()
    {
        float left = -(columns - 1) * spacingX / 2f;
        for (int row = 0; row < rows; row++)
        {
            for (int col = 0; col < columns; col++)
            {
                Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
                Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
                brick.SetHits(rowHits[row]);
            }
        }
    }

    public void BrickBroken(Brick brick)
    {
        score += brick.points;
        ShowHud();
    }

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

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

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

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