Menu
CoddyTech

Phương thức mở rộng

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 42 trên 64.

Vector3 và Transform thuộc về Unity, nên bạn không thể thêm phương thức vào chúng. Phương thức mở rộng là một phương thức static mà C# cho phép bạn gọi như thể đó là phương thức của chúng. Hai phương thức này giúp tiết kiệm những dòng code thường xuất hiện trong mọi dự án:

public static class UnityExtensions
{
    public static Vector3 WithY(this Vector3 v, float y)
    {
        return new Vector3(v.x, y, v.z);
    }

    public static void DestroyChildren(this Transform parent)
    {
        foreach (Transform child in parent)
        {
            Object.Destroy(child.gameObject);
        }
    }
}
// trong bất kỳ script nào
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();

Phương thức mở rộng có ba đặc điểm: một lớp static không lồng bên trong lớp khác và không phải lớp generic, một phương thức static, và từ khóa this đứng trước tham số đầu tiên. Tham số đó là giá trị ở bên trái dấu chấm, vì vậy transform.position.WithY(0.5f) được biên dịch thành UnityExtensions.WithY(transform.position, 0.5f). Vector3 là một struct, nên v là bản sao: WithY không thể thay đổi vector của bên gọi mà thay vào đó trả về một vector mới. Cách này cũng giúp tránh lỗi với transform.position.y = 0.5f;, vì câu lệnh đó không biên dịch được.

Lớp static không phải là MonoBehaviour. Lớp này nằm trong một tệp .cs riêng, tên nào cũng được, và không bao giờ gắn vào một đối tượng. Với các phương thức mà MonoBehaviour kế thừa, chẳng hạn như Destroy, bạn cần ghi tên lớp ở đây: Object.Destroy. Xóa các đối tượng con bên trong vòng lặp foreach là an toàn, vì Unity chỉ xóa chúng vào cuối khung hình.

challenge icon

Thử thách

Trung bình

Thêm hai phương thức mở rộng cho con cú.

  1. Trong FlatExtensions, thêm FlatDistance(this Vector3 a, Vector3 b) dạng public static: khoảng cách không tính độ cao, bằng 5 từ (0, 5, 0) đến (3, 0, 4).
  2. Tương tự, FaceFlat(this Transform t, Vector3 target) chỉ xoay t quanh trục y.
  3. Trong Owl, xoay mặt về phía người chơi bằng FaceFlat; eyes sáng khi FlatDistance nhỏ hơn sight.

Nhấn Chơi rồi đi bên dưới con cú: mắt nó sẽ sáng lên. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public static class FlatExtensions
{
    // Đặt FlatDistance (Vector3) và FaceFlat (Transform) ở đây
}

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

Tự luyện tập: Playground Unity