GetComponents
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 9 trên 64.
GetComponent<T>() trả về kết quả khớp đầu tiên. GetComponents<T>() trả về mọi kết quả khớp trên đối tượng dưới dạng một mảng, còn GetComponentsInChildren<T>() trả về mọi kết quả khớp trên đối tượng và toàn bộ các đối tượng con bên dưới. Khi dùng một giao diện làm T, chỉ với một lần gọi, bạn thu thập được mọi bộ phận có thể thực hiện một việc nào đó, bất kể lớp của chúng là gì. Ở đây, các máy móc trong nhà máy là đối tượng con của đối tượng Factory, và mỗi bộ phận chạy bằng điện đều triển khai IPowered:
public interface IPowered
{
void SetPower(bool on);
}public class Generator : MonoBehaviour
{
public GameObject factory;
public void Switch(bool on)
{
IPowered[] parts = factory.GetComponentsInChildren<IPowered>();
foreach (IPowered part in parts)
{
part.SetPower(on);
}
Debug.Log(parts.Length + " parts powered");
}
}Đèn bật Light, quạt bắt đầu quay, băng chuyền bắt đầu di chuyển, mỗi bộ phận thực hiện việc đó trong SetPower riêng. Một máy có cả đèn và quạt trên cùng một đối tượng sẽ được tính hai lần, vì mỗi thành phần là một kết quả khớp riêng. Generator không gọi tên chúng, nên nếu sau này thêm một còi báo động triển khai IPowered vào bên dưới Factory, lần gọi Switch tiếp theo sẽ bật nó.
GetComponentsInChildren bao gồm cả đối tượng mà bạn gọi phương thức này, đồng thời bỏ qua các đối tượng con không hoạt động, trừ khi bạn truyền true: GetComponentsInChildren<IPowered>(true). GetComponents chỉ kiểm tra một đối tượng, phù hợp với các bộ phận nằm cạnh nhau, chẳng hạn như đèn và còi báo trên cùng một cánh cửa.
Thử thách
DễHãy để mọi bộ phận của robot thể hiện phản ứng khi bị đánh trúng.
- Trong
IHitReaction.cs, khai báopublic interface IHitReactionvớivoid React(int damage);. - Cho
Flash,RecoilvàSparkstriển khai giao diện này: đổi tên từng phương thức thànhpublic void React(int damage). - Recoil di chuyển lùi lại
0.5f * damage; Sparks tạo radamagetia lửa. - Trong
TakeDamage, gọiReact(amount)trên mọi kết quả củaGetComponentsInChildren<IHitReaction>(), sau đó ghi nhật kýReactions: 3(số lượng của chúng).
Nhấn Play, nhấn Space, rồi nhấp chuột. Sau đó nhấn Check.
Tự làm thử
using UnityEngine;
public class Health : MonoBehaviour
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
GetComponentInChildren<Flash>().Show();
}
}
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