Menu
CoddyTech

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.
challenge icon

Thử thách

Trung bình

Mỗi tháp chọn kẻ địch gần nhất trong tầm bắn.

  1. Trong Enemy, thêm public static readonly List<Enemy> All = new List<Enemy>();; thêm this trong OnEnable, xóa nó trong OnDisable.
  2. Trong Tower, thêm public float range = 4f; và private Enemy target;.
  3. Mỗi khung hình, tìm kẻ địch gần nhất trong Enemy.All nằm trong range (hoặc null), ghi log "Target: " + found.name khi đó là mục tiêu mới, rồi lưu mục tiêu đó trong target.

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