Menu
CoddyTech

확장 메서드

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

Vector3와 Transform은 Unity에 속하므로 여기에 메서드를 추가할 수 없습니다. 확장 메서드는 C#에서 마치 해당 타입의 메서드인 것처럼 호출할 수 있게 해 주는 정적 메서드입니다. 이 두 메서드는 모든 프로젝트에서 반복되는 코드 줄을 줄여 줍니다.

public static class UnityExtensions
{
    public static Vector3 WithY(this Vector3 v, float y)
    {
        return new Vector3(v.x, y, v.z);
    }

    public static void DestroyChildren(this Transform parent)
    {
        foreach (Transform child in parent)
        {
            Object.Destroy(child.gameObject);
        }
    }
}
// 어떤 스크립트에서든
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();

확장 메서드에는 세 가지 조건이 있습니다. 중첩되지도 제네릭도 아닌 정적 클래스, 정적 메서드, 그리고 첫 번째 매개변수 앞의 this입니다. 이 매개변수는 점 왼쪽에 있는 값이므로 transform.position.WithY(0.5f)는 UnityExtensions.WithY(transform.position, 0.5f)로 컴파일됩니다. Vector3는 구조체이므로 v는 복사본입니다. 따라서 WithY는 호출자의 벡터를 변경할 수 없고 대신 새 벡터를 반환합니다. 이 방식은 컴파일되지 않는 transform.position.y = 0.5f; 문제를 해결해 주기도 합니다.

정적 클래스는 MonoBehaviour가 아닙니다. 별도의 .cs 파일에 두면 되며, 파일 이름은 무엇이든 괜찮고 오브젝트에 추가하지 않습니다. Destroy처럼 MonoBehaviour에서 상속되는 메서드는 여기서 클래스를 지정해야 합니다. Object.Destroy처럼 말이죠. foreach 안에서 자식 오브젝트를 삭제해도 안전합니다. Unity가 프레임 끝에 자식 오브젝트를 제거하기 때문입니다.

challenge icon

챌린지

중급

올빼미에 확장 메서드 두 개를 추가하세요.

  1. FlatExtensions에 public static FlatDistance(this Vector3 a, Vector3 b)를 추가하세요. 높이를 제외한 거리입니다. (0, 5, 0)에서 (3, 0, 4)까지의 거리는 5입니다.
  2. 마찬가지로, FaceFlat(this Transform t, Vector3 target)은 t를 y축 기준으로만 회전시킵니다.
  3. Owl에서 FaceFlat으로 플레이어를 향하게 하세요. FlatDistance가 sight보다 작으면 eyes가 켜집니다.

‘플레이’를 누르고 올빼미 아래로 걸어가 보세요. 올빼미의 눈이 빛납니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

public static class FlatExtensions
{
    // FlatDistance (Vector3)와 FaceFlat (Transform)은 여기에 작성합니다
}

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

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