Menu
CoddyTech

제네릭 헬퍼

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>가 반환하는 배열도 받을 수 있습니다.

challenge icon

챌린지

중급

충격 타워의 상자와 램프를 위한 제네릭 도우미를 하나 작성하세요.

  1. Helpers.cs에서 정적 클래스 Helpers를 작성하고, 컴포넌트를 대상으로 하는 public 메서드 InRange<T>(IEnumerable<T> items, Vector3 center, float range)를 작성하세요. 이 메서드는 range 이내에 있는 항목을 담은 List<T>를 반환합니다.
  2. Pulse에서 Space 키를 누르면 범위 안의 모든 Rigidbody에 위쪽 방향으로 lift만큼의 충격을 가하세요.
  3. 그런 다음 범위 안의 모든 Lamp에 TurnOn()을 호출하세요.

‘플레이’를 누르고 Space 키를 누르세요. 가까이 있는 상자가 튀어 오릅니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: 한 지점의 범위 내에 있는 항목들

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

직접 연습해 보세요: Unity 플레이그라운드