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