Trò chơi kết thúc
Bài học 13 trên 19 trong khóa học Trò chơi Unity: phá gạch của Coddy.
Mất hết mạng cuối cùng sẽ kết thúc trò chơi. Quả bóng rời khỏi cuộc chơi, bảng Game Over phủ lên màn hình và nút Play Again bắt đầu một trò chơi mới. Giờ đây, cảnh có bảng này ẩn bên trong canvas HUD, còn danh sách On Click của nút trong Inspector đã gọi GameManager.PlayAgain. Danh sách On Click chỉ hiển thị các phương thức public, vì vậy phương thức bạn chọn cho một nút phải là public.
Cách đơn giản nhất để bắt đầu trò chơi mới là tải lại cảnh. Mỗi đối tượng được tạo mới từ cảnh: một GameManager mới với điểm số 0 và 3 mạng, một bức tường mới, quả bóng trở lại trên thanh đỡ. Cảnh đang chạy là SceneManager.GetActiveScene(), còn buildIndex là số thứ tự của cảnh đó trong bản dựng:
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);Ẩn quả bóng bằng SetActive(false) sẽ dừng Update() của nó, nên phím Space không thể phóng bóng nữa và bóng cũng bị loại khỏi hệ thống vật lý. Phép kiểm tra diễn ra sau lives--, vì vậy trò chơi kết thúc khi lives về 0: tức là quả bóng thứ ba bị mất khi lives bắt đầu ở mức 3.
Thử thách
Trung bìnhMất mạng cuối cùng sẽ kết thúc trò chơi, còn nút Chơi lại sẽ bắt đầu lại từ đầu.
- Trong
GameManager, thêmusing UnityEngine.SceneManagement;vàpublic GameObject gameOverPanel; - Trong BallLost, khi
lives == 0, hiển thị bảng và ẩn quả bóng bằnglost.gameObject.SetActive(false); nếu không thì đặt lại như trước. - Viết
public void PlayAgain():SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
Nhấn Chơi, để mất ba quả bóng rồi nhấn Chơi lại: trò chơi mới sẽ bắt đầu. Sau đó nhấn Kiểm tra.
Tự làm thử
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;
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Trò chơi Unity: phá gạch
3Luồng trò chơi
Điểm số và mạngTự luyện tập: Playground Unity