Menu
CoddyTech

GetComponents

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 8번째.

GetComponent<T>()는 첫 번째 일치 항목을 반환합니다. GetComponents<T>()는 객체에서 일치하는 모든 항목을 배열로 반환하고, GetComponentsInChildren<T>()는 객체와 그 아래의 모든 항목에서 일치하는 모든 항목을 반환합니다. T에 인터페이스를 지정하면 한 번의 호출로 클래스와 관계없이 해당 기능을 수행할 수 있는 모든 부분을 수집합니다. 여기서 공장의 기계들은 Factory 객체의 자식이며, 전원으로 작동하는 각 부분은 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");
    }
}

Lamp는 Light를 켜고, Fan은 회전을 시작하며, Conveyor는 움직이기 시작합니다. 각각 자체 SetPower에서 이를 처리합니다. 한 객체에 Lamp와 Fan이 함께 있는 기계는 각 컴포넌트가 별도의 일치 항목이므로 두 번 계산됩니다. Generator는 이들의 이름을 전혀 지정하지 않으므로, 나중에 Factory 아래에 추가된 IPowered 구현체인 Siren도 다음 Switch 호출에서 켜집니다.

GetComponentsInChildren은 호출 대상 객체를 포함하며, true를 전달하지 않으면 비활성 자식은 건너뜁니다: GetComponentsInChildren<IPowered>(true). GetComponents는 객체 하나만 살펴보므로, 문 하나에 나란히 설치된 조명과 버저 같은 부분에 적합합니다.

challenge icon

챌린지

쉬움

훈련용 로봇은 공격을 받을 때마다 반응해야 합니다. Robot의 Health.cs는 hp를 세고, 세 부분이 반응할 수 있습니다. Head의 Flash는 빨갛게 변하고, Robot의 Recoil은 로봇을 뒤로 밀어내며, Antenna의 Sparks는 불꽃을 튀깁니다. Space 키를 누르면 로봇에 1의 피해를 주고 클릭하면 2의 피해를 줍니다(Trainer.cs는 준비되어 있습니다). 현재 Health는 머리에만 알립니다.

  • IHitReaction.cs에서 메서드 하나인 IHitReaction 인터페이스를 선언하세요. 메서드는 void React(int damage)입니다.
  • Flash, Recoil, Sparks가 이 인터페이스를 구현하도록 하세요. 각 메서드는 React(int damage)가 됩니다. Flash는 기존과 동일하게 동작합니다. Recoil은 피해 1점당 로봇을 뒤로(+z 방향으로) 0.5단위 밀어내고, Sparks는 피해 1점당 불꽃 하나를 튀깁니다.
  • Health의 TakeDamage에서 hp가 감소한 뒤, 한 번의 GetComponentsInChildren 호출로 찾은 Robot과 그 자식의 모든 IHitReaction에 React(amount)를 호출하고, 반응한 수를 Reactions: 3과 같이 로그에 기록하세요.

Play를 누르고 Space 키와 클릭으로 로봇을 공격한 다음 Check를 누르세요.

직접 해보기

using UnityEngine;

public class Health : MonoBehaviour
{
    public int hp = 10;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        GetComponentInChildren<Flash>().Show();
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 게임 아키텍처의 모든 레슨