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.
Thử thách
Trung bìnhThêm hai phương thức mở rộng cho con cú.
- Trong
FlatExtensions, thêmFlatDistance(this Vector3 a, Vector3 b)dạng public static: khoảng cách không tính độ cao, bằng5từ (0, 5, 0) đến (3, 0, 4). - Tương tự,
FaceFlat(this Transform t, Vector3 target)chỉ xoaytquanh trục y. - Trong
Owl, xoay mặt về phía người chơi bằng FaceFlat;eyessáng khi FlatDistance nhỏ hơnsight.
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
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