Tìm mục tiêu
Bài học 8 trên 25 trong khóa học Game Unity: thủ thành của Coddy.
Tháp bắn kẻ địch gần nhất, miễn là kẻ địch đó nằm trong range của tháp. Để chọn mục tiêu, tháp cần biết mọi kẻ địch trên bàn chơi. FindObjectsByType<Enemy> sẽ tìm kiếm toàn bộ cảnh trong mỗi khung hình cho từng tháp, vì vậy thay vào đó, các kẻ địch tự lưu danh sách của mình: một danh sách tĩnh trong lớp (class) Enemy, nơi mỗi kẻ địch tham gia trong OnEnable và rời khỏi trong OnDisable. Unity gọi OnDisable trên một đối tượng sắp bị hủy, vì vậy kẻ địch đã chết cũng rời khỏi danh sách. Vật phẩm nhặt được trong trò chơi cũng có thể làm như vậy:
public class Pickup : MonoBehaviour
{
public static readonly List<Pickup> All = new List<Pickup>();
void OnEnable()
{
All.Add(this);
}
void OnDisable()
{
All.Remove(this);
}
}Tìm vật gần nhất là một vòng lặp (loop) ghi nhớ vật tốt nhất cho đến lúc đó. Nam châm hút vật phẩm gần nhất trong phạm vi pullRange bắt đầu mà chưa có vật phẩm nào và lấy phạm vi làm khoảng cách tốt nhất, nên vật phẩm ở xa hơn không thể được chọn:
Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
// Gần hơn đối tượng gần nhất hiện tại? Lưu nó cùng khoảng cách tương ứng.
}Vector3.Distance(a, b) cho biết khoảng cách giữa hai điểm. Khi không có vật nào trong phạm vi, vòng lặp không giữ lại vật nào và kết quả là null.Thử thách
Trung bìnhMỗi tháp chọn kẻ địch gần nhất trong tầm bắn.
- Trong
Enemy, thêmpublic static readonly List<Enemy> All = new List<Enemy>();; thêmthistrongOnEnable, xóa nó trongOnDisable. - Trong
Tower, thêmpublic float range = 4f;vàprivate Enemy target;. - Mỗi khung hình, tìm kẻ địch gần nhất trong
Enemy.Allnằm trongrange(hoặc null), ghi log"Target: " + found.namekhi đó là mục tiêu mới, rồi lưu mục tiêu đó trongtarget.
Nhấn Play rồi xây tháp dọc theo đường đi: Console hiển thị tên của từng mục tiêu mới. Sau đó nhấn Check.
Tự làm thử
using UnityEngine;
// Sẽ làm sau: tháp tìm kẻ địch trong tầm bắn, xoay về phía đó rồi khai hỏa.
public class Tower : MonoBehaviour
{
}
Tất cả bài học trong Game Unity: thủ thành
Tự luyện tập: Playground Unity