השלב הושלם
שיעור 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' הוא char שהקוד שלו הוא 51. הקודים של עשר הספרות מסודרים לפי הסדר, ולכן החסרת '0' (קוד 48) נותנת את המספר: '3' - '0' הוא int שערכו 3.
שלב מסתיים כשנשברת הלבנה האחרונה שלו. סופרים: מוסיפים אחד על כל לבנה שנבנית, מחסירים אחד על כל לבנה שנשברת, וכשמגיעים ל־0 השלב הושלם. ספירת הלבנים שעדיין נמצאות בסצנה לא עובדת באותו רגע, כי Destroy ממתינה לסוף הפריים, ולכן הלבנה שנשברת עדיין שם.
אתגר
בינוניבנו את הלבנים מתוך טקסט. הסצנה ממלאת את levels בשלושה מבנים; הראשון הוא הקיר שיש לכם עכשיו.
- ב־
GameManager, הסירו אתrows,columnsואתrowHits. הוסיפוpublic string[] levels, אתpublic Ball ball(הסצנה מקשרת את Ball), משתנהint levelומשתנהint bricksLeft. - החליפו את
BuildWall()ב־void BuildLevel(int index): היא שומרת אתindexב־levelומפצלת אתlevels[index]לשורות לפי/. עבור כל ספרהc, היא בונה לבנה עםc - '0'פגיעות ומוסיפה 1 ל־bricksLeft; הנקודות נשארות ריקות. השורות ממורכזות ומרווחות כמו קודם.Start()קוראת ל־BuildLevel(0). - ב־
BrickBroken, הפחיתו 1 מ־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;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.