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.
Thử thách
KhóHoàn thiện tháp; Nearest(range) và Show() đã sẵn sàng.
TowerLevel: có thể tuần tự hóa, với các thuộc tính công khairange,fireEvery,damage,cost.TowerDatachứapublic List<TowerLevel> levels.- Cứ mỗi
fireEverygiây, nếuNearest(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). - Gọi
Show()sau khiCreep.Killedtrảbountyvà sau khi nhấn Space để mua cấp tiếp theo vớicosttươ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
1Thành phần, không phải hệ thống phân cấp
Thành phần nhỏTập lệnh kẻ địch cơ sởThành phần trừu tượngCác thành phần phối hợp với nhauÔn tập: tháp pháo mô-đunÔn tập: pháo nòng đôi4Dữ liệu tuần tự hóa
Lớp có thể tuần tự hóaDanh sách trong InspectorKiểu liệt kê trong InspectorÔn tập: Bảng vật phẩm rơiÔn tập: Quay vật phẩm2Giao diện trong Unity
IDamageableGiao diện và TryGetComponentGetComponentsÔn tập: phím tương tácÔn tập: đối tượng gần nhất trong tầm với5ScriptableObjects
Tài sản dữ liệuChỉ số vũ khíCài đặt dùng chungLưu gióSóng dưới dạng dữ liệuÔn tập: Cơ sở dữ liệu vật phẩmÔn tập: Mua hàng từ cửa hàng8Code có thể tái sử dụng
Phương thức mở rộngSingleton tổng quátCác hàm hỗ trợ tổng quátÔn tập: FindNearest3Sự kiện
Sự kiện C# trong UnityĐăng ký trong OnEnableCác trường UnityEventSự kiện điều khiển UIÔn tập: Cửa sổ bật lên thành tíchÔn tập: Bộ hẹn giờ cửa sổ bật lên6Lưu dữ liệu bằng JSON
JsonUtilityLưu trò chơiTải dữ liệu và giá trị mặc địnhÔn tập: các ô lưuChọn và xóa một ô lưu9Tái sử dụng đối tượng bằng pool
Vì sao cần pool đối tượngPool dùng hàng đợiObjectPool của UnityÔn tập: pool đạnTự luyện tập: Playground Unity