Tập lệnh kẻ địch cơ sở
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 2 trên 64.
Trong C#, một lớp có thể kế thừa từ lớp khác: class Ghost : Enemy nhận mọi trường và phương thức của Enemy, rồi bổ sung những thành phần riêng. Phương thức mà lớp cơ sở đánh dấu là virtual có thể được lớp con thay thế bằng override, còn base.Describe() gọi phiên bản của lớp cơ sở từ bên trong phiên bản mới. C# cơ bản:
class Enemy
{
protected int hp = 3;
public virtual string Describe()
{
return "Enemy with " + hp + " hp";
}
}
class Ghost : Enemy
{
public override string Describe()
{
return base.Describe() + ", see-through";
}
}Describe() của Ghost trả về Enemy with 3 hp, see-through. protected nghĩa là Enemy và các lớp con có thể dùng hp, còn các lớp khác thì không.
Trong Unity, kẻ địch dùng chung phần lớn code: điểm máu, tốc độ và cách di chuyển. Phần code đó nằm trong một lớp cơ sở kế thừa từ MonoBehaviour, còn mỗi loại kẻ địch kế thừa từ lớp này. Enemy này đặt điểm máu trong Start và đi theo hướng đang quay mặt trong Update, còn Ghost thay đổi phần khởi động để di chuyển nhanh gấp đôi:
public class Enemy : MonoBehaviour
{
public int maxHp = 3;
public float speed = 2f;
protected int hp;
protected virtual void Start()
{
hp = maxHp;
}
protected virtual void Update()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}public class Ghost : Enemy
{
protected override void Start()
{
base.Start();
speed *= 2f;
}
}Ghost kế thừa các trường, nên Inspector hiển thị maxHp và speed trên Ghost. Ghost cũng kế thừa Update, nên nó di chuyển mà không cần có Update riêng. hp là protected: Enemy và các lớp con có thể dùng nó, còn các script khác thì không.
Unity tìm Start và Update theo tên, bất kể quyền truy cập của chúng, rồi gọi phương thức trong lớp cụ thể nhất. Nếu Start của Enemy là private void Start() và Ghost khai báo Start riêng, Unity chỉ gọi phương thức của Ghost: phương thức của Enemy sẽ không bao giờ chạy, và hp vẫn bằng 0 mà không có lỗi nào. Khai báo các phương thức sự kiện của lớp cơ sở là protected virtual giúp cách này trở thành C# thông thường: lớp con viết override, còn base.Start() chạy phần của lớp cơ sở tại vị trí bạn gọi nó. Nếu bỏ lời gọi này, phần của lớp cơ sở sẽ bị bỏ qua. Đây là cách lớp con thay thế một bước thay vì bổ sung vào bước đó.
Thử thách
DễCho Golem và Wasp chạy phần của Enemy trước phần riêng của chúng.
- Trong
Enemy, viếtprotected virtualtrướcvoid Start()vàvoid Update(). - Trong
Golem, đổi thànhprotected override void Start()vớibase.Start();là dòng đầu tiên. - Trong
Wasp, đổi thànhprotected override void Update()vớibase.Update();là dòng đầu tiên.
Nhấn Chơi: golem tiến lên với hp đầy, còn wasp vừa tiến lên vừa di chuyển zíc zắc. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
// Những đặc điểm chung của mọi quái vật.
public class Enemy : MonoBehaviour
{
public int maxHp = 4;
public float speed = 1.5f;
protected int hp;
protected Vector3 spawnPoint;
void Start()
{
hp = maxHp;
spawnPoint = transform.position;
}
void Update()
{
// Tiến về phía lâu đài theo chiều âm của trục z
transform.position += Vector3.back * speed * Time.deltaTime;
}
}
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