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는 객체 하나만 살펴보므로, 문 하나에 나란히 설치된 조명과 버저 같은 부분에 적합합니다.
챌린지
쉬움훈련용 로봇은 공격을 받을 때마다 반응해야 합니다. 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();
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.