제네릭 헬퍼
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 35번째.
일부 헬퍼는 모든 타입에서 동일합니다. 컴포넌트를 가져오거나 추가하고, 배열에서 무작위 항목을 선택합니다. 제네릭 메서드를 사용하면 타입을 매개변수 T로 받아 한 번만 작성할 수 있으며, 각 호출에서 타입이 지정됩니다:
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는 T에 대한 약속이며, 메서드가 T로 무엇을 할 수 있는지 결정합니다. AddComponent는 컴포넌트만 받으므로 제약 조건이 없으면 컴파일러가 go.AddComponent<T>()를 거부합니다. 제약 조건이 있으면 Unity의 Rigidbody나 직접 작성한 스크립트 등 어떤 컴포넌트든 사용할 수 있습니다. 또한 이 제약 조건 덕분에 .transform과 .gameObject처럼 T에서 Component의 모든 멤버를 사용할 수 있습니다. 이미 Rigidbody가 있는 상자에서는 해당 Rigidbody를 돌려받으며, 아무것도 추가되지 않습니다.
RandomItem은 T를 전혀 건드리지 않으므로 제약 조건이 없습니다. 따라서 색상, 문자열, 프리팹 모두에 사용할 수 있습니다. 호출할 때 타입을 직접 지정하는 경우는 드뭅니다. Color[]인 colors를 보고 컴파일러가 T가 Color임을 알아냅니다. T[] 대신 IEnumerable<T>를 받는 메서드는 배열과 List를 모두 받으며, FindObjectsByType<T>가 반환하는 배열도 포함됩니다.
챌린지
중급충격 타워가 마당에 서 있습니다. 스페이스바를 누르면 파동을 내보냅니다. 타워에서 4 이내에 있는 상자는 위로 튀어 오르고, 4 이내에 있는 램프는 켜집니다. Lamp.cs는 준비되어 있으며, TurnOn()이 있습니다. 둘 다 찾는 헬퍼를 작성하세요.
Helpers.cs에 제네릭 메서드InRange<T>(IEnumerable<T> items, Vector3 center, float range)를 포함하는 정적 클래스Helpers를 작성하세요. 이 메서드는 모든 컴포넌트 유형에서 사용할 수 있습니다.center에서 거리가 최대range인 항목들을 담은List<T>를 반환합니다.Pulse.cs에서 스페이스바를 누르면, 씬에서 타워로부터range이내에 있는 모든 Rigidbody에 위쪽으로lift만큼의 충격을 가하고,range이내에 있는 모든 Lamp를 켜세요.FindObjectsByType가 반환하는 배열에 두 경우 모두 InRange를 사용하세요.
Play를 누르고 스페이스바를 누른 다음 Check를 누르세요.
직접 해보기
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: 한 점의 범위 내에 있는 항목들
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.