Menu
CoddyTech

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 đó.

challenge icon

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.

  1. Trong Enemy, viết protected virtual trước void Start() và void Update().
  2. Trong Golem, đổi thành protected override void Start() với base.Start(); là dòng đầu tiên.
  3. Trong Wasp, đổi thành protected override void Update() với base.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

Tự luyện tập: Playground Unity