Menu
CoddyTech

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.

challenge icon

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.

  1. Trong IHitReaction.cs, khai báo public interface IHitReaction với void React(int damage);.
  2. Cho Flash, Recoil và Sparks triển khai giao diện này: đổi tên từng phương thức thành public void React(int damage).
  3. Recoil di chuyển lùi lại 0.5f * damage; Sparks tạo ra damage tia lửa.
  4. Trong TakeDamage, gọi React(amount) trên mọi kết quả của GetComponentsInChildren<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

Tự luyện tập: Playground Unity