Mất một quả bóng
Bài học 8 trên 19 trong khóa học Trò chơi Unity: phá gạch của Coddy.
Bóng lọt qua thanh đỡ sẽ bị mất. Cảnh bên dưới thanh đỡ giờ có một vùng tử thần: một đối tượng có collider hình hộp được đặt thành Is Trigger và có thẻ DeathZone. Vùng kích hoạt không chặn gì cả; nó gửi OnTriggerEnter(Collider other) khi một vật có Rigidbody đi vào. Bóng báo mất lượt cho GameManager, đối tượng quản lý số mạng và quyết định việc tiếp theo sẽ xảy ra.
Viên bi rơi xuống nước sẽ xuất hiện lại ở điểm xuất phát:
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Water")) Respawn();
}
void Respawn()
{
rb.linearVelocity = Vector3.zero;
transform.position = spawnPoint.position;
}Bóng cần ít thao tác hơn viên bi. Update() đã đặt bóng trên thanh đỡ ở mỗi khung hình khi launched là false, nên để đặt lại, chỉ cần xóa cờ đó và dừng bóng: khung hình tiếp theo sẽ đưa bóng trở lại, rồi phím Space sẽ phóng bóng đi lần nữa.
Thử thách
Trung bìnhĐể bóng rơi sẽ mất một mạng và đưa bóng trở lại thanh đỡ.
- Trong
Ball, viếtpublic void ResetToPaddle():launched = false;và vận tốcVector3.zero. - Trong
OnTriggerEntercủa Ball, khi đi vào đối tượng có thẻDeathZone, hãy gọiGameManager.Instance.BallLost(this). - Trong
GameManager, thêmpublic int lives = 3;vàpublic void BallLost(Ball lost): giảm một mạng, sau đó gọilost.ResetToPaddle();
Nhấn Chơi rồi để bóng rơi: bóng sẽ lại nằm trên thanh đỡ. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
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 };
int score;
void Awake()
{
Instance = this;
}
void Start()
{
BuildWall();
}
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;
}
}
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
Tự luyện tập: Playground Unity