Menu
CoddyTech

Phòng thủ tháp cơ bản

Thuộc phần Kiến trúc trò chơi trong Unity trong hành trình Unity của Coddy. Bài học 61 trên 64.

Quái vật di chuyển dọc theo con đường về phía căn cứ của bạn, và một tòa tháp duy nhất bảo vệ nơi đó. Tòa tháp bắn đạn vào quái vật gần nó nhất khi quái vật còn trong tầm bắn, và mỗi quái vật bị hạ sẽ mang lại vàng. Phím cách dùng số vàng đó để nâng cấp tòa tháp: mỗi cấp có tầm bắn xa hơn, bắn nhanh hơn hoặc gây sát thương mạnh hơn. Quái vật đến được căn cứ sẽ lọt qua. Các cấp độ là dữ liệu trò chơi mà nhà thiết kế có thể điều chỉnh trong một tài nguyên mà không cần sửa code, và tòa tháp bắn rất nhiều đạn, nên nó tái sử dụng đạn từ một nhóm thay vì tạo rồi hủy từng viên sau mỗi phát bắn.

Viết hai script: TowerData, kiểu tài nguyên, và Tower. Creep, Bolt và CreepSpawner đã sẵn sàng, cả Nearest và Show của tòa tháp cũng vậy.

challenge icon

Thử thách

Khó

Hoàn thiện tháp; Nearest(range) và Show() đã sẵn sàng.

  1. TowerLevel: có thể tuần tự hóa, với các thuộc tính công khai range, fireEvery, damage, cost. TowerData chứa public List<TowerLevel> levels.
  2. Cứ mỗi fireEvery giây, nếu Nearest(range) tìm thấy một creep, hãy tạo một bolt từ ObjectPool<Bolt> tại tháp: bolt.Launch(creep, damage, pool.Release).
  3. Gọi Show() sau khi Creep.Killed trả bounty và sau khi nhấn Space để mua cấp tiếp theo với cost tương ứng, đồng thời ghi nhật ký Tower level 2.

Nhấn Chơi rồi nâng cấp. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Pool;
using TMPro;

public class Tower : MonoBehaviour
{
    [SerializeField] private TowerData data;
    [SerializeField] private Bolt boltPrefab;
    [SerializeField] private TMP_Text infoText;

    private int level;
    private int gold;

    // Sẵn sàng: trả về creep gần tháp nhất trong phạm vi, hoặc null.
    Creep Nearest(float range)
    {
        Creep nearest = null;
        float best = Mathf.Infinity;
        foreach (Collider hit in Physics.OverlapSphere(transform.position, range))
        {
            if (hit.TryGetComponent(out Creep creep))
            {
                float distance = Vector3.Distance(transform.position, creep.transform.position);
                if (distance < best)
                {
                    best = distance;
                    nearest = creep;
                }
            }
        }
        return nearest;
    }

    // Sẵn sàng: hiển thị cấp độ và số vàng, chẳng hạn Level 1, 0 gold.
    void Show()
    {
        infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
    }
}

Tất cả bài học trong Kiến trúc trò chơi trong Unity

Tự luyện tập: Playground Unity