Chỉ số vũ khí
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 24 trên 64.
Một thanh kiếm và một chiếc búa làm cùng một việc: vung lên, chờ rồi lại vung lên. Điểm khác nhau nằm ở các con số. Kiếm gây 4 sát thương và vung mỗi 0.5 giây, còn búa gây 10 sát thương mỗi 1.5 giây. Vì vậy, một script Weapon có thể dùng cho cả hai, còn các con số của từng vũ khí nằm trong một tài nguyên (asset):
[CreateAssetMenu(menuName = "Combat/Weapon Data")]
public class WeaponData : ScriptableObject
{
public string weaponName;
public int damage;
public float swingTime;
public GameObject hitEffect;
}public class Weapon : MonoBehaviour
{
public WeaponData data;
private float nextSwing;
public void Swing(Health target)
{
if (Time.time < nextSwing) return;
nextSwing = Time.time + data.swingTime;
target.TakeDamage(data.damage);
Instantiate(data.hitEffect, target.transform.position, Quaternion.identity);
}
}Dự án có một tài nguyên Sword (4, 0.5, prefab tia lửa) và một tài nguyên Hammer (10, 1.5, prefab bụi). Cả hiệp sĩ lẫn quỷ khổng lồ đều có script Weapon; trường data của hiệp sĩ chứa Sword, còn của quỷ khổng lồ chứa Hammer. Bạn có thể tạo thêm một tài nguyên giáo từ menu Create mà không cần thay đổi script nào. Một tài nguyên có thể trỏ đến prefab và các tài nguyên khác, như hitEffect, nhưng không thể trỏ đến đối tượng trong cảnh: nó nằm trong dự án, bên ngoài mọi cảnh.
Các cách khác để tạo ra nhiều loại vũ khí đều đặt các con số trong code. if (weaponName == "Sword") damage = 4; else if ... sẽ dài thêm với mỗi vũ khí, còn một lớp con Sword của Weapon chỉ đặt các con số thì có nghĩa là mỗi tài nguyên cần một lớp riêng. Lớp con dành cho những vũ khí hoạt động khác nhau, chẳng hạn như cung bắn tên. Vũ khí chỉ cần gây sát thương mạnh hơn hoặc vung nhanh hơn thì cần một tài nguyên riêng, không cần code.
Thử thách
Trung bìnhĐể mỗi khẩu súng đọc các chỉ số từ tài nguyên GunData của nó.
- Trong
Gun, thêmpublic GunData data;. - Bắn
data.bulletPrefab, chờdata.fireIntervalgiữa các phát bắn và gándata.damagecho mỗi viên đạn. - Xóa
gunType, hai biến về đạn, ba bản sao riêng tư vàStart().
Nhấn Chơi và giữ phím Space: súng blaster cũng bắn. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
using UnityEngine.InputSystem;
public class Gun : MonoBehaviour
{
public string gunType = "Pistol";
public GameObject pistolBullet;
public GameObject rifleBullet;
private GameObject bulletPrefab;
private float fireInterval;
private int damage;
private float nextShot;
void Start()
{
if (gunType == "Pistol")
{
bulletPrefab = pistolBullet;
fireInterval = 0.25f;
damage = 1;
}
else if (gunType == "Rifle")
{
bulletPrefab = rifleBullet;
fireInterval = 0.6f;
damage = 4;
}
}
void Update()
{
if (Keyboard.current.spaceKey.isPressed && Time.time >= nextShot)
{
nextShot = Time.time + fireInterval;
GameObject bullet = Instantiate(bulletPrefab, transform.position + transform.forward, transform.rotation);
bullet.GetComponent<Bullet>().damage = damage;
}
}
}
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