제네릭 헬퍼
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 64개 중 44번째.
몇 가지 도우미는 모든 형식에서 동일합니다. 컴포넌트를 가져오거나 추가하고, 배열에서 임의의 항목을 선택합니다. 제네릭 메서드를 사용하면 형식을 매개변수 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든 직접 작성한 스크립트든 모든 컴포넌트를 사용할 수 있습니다. 또한 이 제약 조건 덕분에 T에서 Component의 모든 멤버, 예를 들면 .transform과 .gameObject를 사용할 수 있습니다. crate에 이미 Rigidbody가 있으면 기존 Rigidbody를 반환하고, 아무것도 추가하지 않습니다.
RandomItem은 T를 전혀 다루지 않으므로 제약 조건이 없습니다. 따라서 색상, 문자열, 프리팹 모두에 사용할 수 있습니다. 호출할 때 형식을 직접 작성하는 경우는 드뭅니다. colors가 Color[]라는 점을 바탕으로 컴파일러가 T는 Color라고 판단합니다. T[] 대신 IEnumerable<T>를 받는 메서드는 배열과 List를 모두 받으며, FindObjectsByType<T>가 반환하는 배열도 받을 수 있습니다.
챌린지
중급충격 타워의 상자와 램프를 위한 제네릭 도우미를 하나 작성하세요.
Helpers.cs에서 정적 클래스Helpers를 작성하고, 컴포넌트를 대상으로 하는 public 메서드InRange<T>(IEnumerable<T> items, Vector3 center, float range)를 작성하세요. 이 메서드는range이내에 있는 항목을 담은List<T>를 반환합니다.Pulse에서 Space 키를 누르면 범위 안의 모든 Rigidbody에 위쪽 방향으로lift만큼의 충격을 가하세요.- 그런 다음 범위 안의 모든 Lamp에
TurnOn()을 호출하세요.
‘플레이’를 누르고 Space 키를 누르세요. 가까이 있는 상자가 튀어 오릅니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: 한 지점의 범위 내에 있는 항목들
Unity 게임 아키텍처의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드