Các hàm hỗ trợ tổng quát
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 44 trên 64.
Một số tiện ích dùng được với mọi kiểu: lấy một thành phần hoặc thêm thành phần đó, chọn ngẫu nhiên một mục trong mảng. Phương thức tổng quát cho phép viết chúng một lần, với kiểu làm tham số T mà mỗi lần gọi sẽ điền vào:
public static class Helpers
{
public static T GetOrAdd<T>(this GameObject go) where T : Component
{
if (!go.TryGetComponent(out T found)) found = go.AddComponent<T>();
return found;
}
public static T RandomItem<T>(T[] items)
{
return items[Random.Range(0, items.Length)];
}
}Rigidbody body = crate.GetOrAdd<Rigidbody>();
Color paint = Helpers.RandomItem(colors);
GameObject enemy = Helpers.RandomItem(enemyPrefabs);where T : Component là một cam kết về T, quyết định phương thức có thể làm gì với kiểu này. AddComponent chỉ nhận các thành phần, nên nếu không có ràng buộc, trình biên dịch sẽ từ chối go.AddComponent<T>(); khi có ràng buộc, mọi thành phần đều dùng được, dù là Rigidbody của Unity hay các script của bạn. Ràng buộc này cũng cho phép bạn truy cập mọi thành viên của Component trên T, chẳng hạn như .transform và .gameObject. Nếu crate đã có Rigidbody, phương thức sẽ trả về thành phần đó mà không thêm gì.
RandomItem không có ràng buộc vì phương thức này không tác động đến T: nó dùng được với màu sắc, chuỗi và prefab. Bạn hiếm khi cần ghi kiểu khi gọi phương thức: từ colors, một Color[], trình biên dịch suy ra T là Color. Phương thức nhận IEnumerable<T> thay vì T[] sẽ chấp nhận cả mảng lẫn List, bao gồm cả các mảng mà FindObjectsByType<T> trả về.
Thử thách
Trung bìnhViết một hàm trợ giúp tổng quát cho các thùng hàng và đèn của tháp xung kích.
- Trong
Helpers.cs, viết lớp tĩnhHelpersvớiInRange<T>(IEnumerable<T> items, Vector3 center, float range)công khai cho các thành phần: trả về mộtList<T>gồm các mục cách không quárange. - Trong
Pulse, khi nhấn Space, tạo xung lực hướng lên có độ lớnliftcho mọi Rigidbody trong phạm vi. - Sau đó gọi
TurnOn()trên mọi Lamp trong phạm vi.
Nhấn Chơi rồi nhấn Space: thùng hàng ở gần sẽ bật lên. Sau đó nhấn Kiểm tra.
Tự làm thử
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: các phần tử nằm trong phạm vi của một điểm
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