확장 메서드
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 33번째.
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가 프레임이 끝날 때까지 실제로 제거하지 않기 때문입니다.
챌린지
중급높은 기둥 위의 부엉이가 마당을 지켜봅니다. 화살표 키로 Player를 움직입니다(준비 완료). 프로젝트에 확장 메서드 두 개를 만들고 부엉이에서 사용하세요:
FlatExtensions.cs에서 정적 클래스FlatExtensions를 작성하세요.FlatDistance는 Vector3를 확장합니다:a.FlatDistance(b)는 높이 차이를 제외하고 지면을 따라a에서b까지의 거리를 반환합니다. (0, 5, 0)에서 (3, 0, 4)까지의 거리는 5입니다.FaceFlat은 Transform을 확장합니다:t.FaceFlat(target)은 y축을 기준으로t가 대상을 바라보도록 회전시켜, 대상의 높이가 아무리 높거나 낮아도 똑바로 서 있게 합니다.Owl.cs에서 매 프레임 부엉이가 FaceFlat으로 플레이어를 바라보게 하고, 플레이어가 지면을 따라sight(3)보다 가까우면eyes를 켜고, 그렇지 않으면 끄세요. 부엉이는 기둥 높은 곳에 있으므로, 여기서는Vector3.Distance를 사용하지 않습니다.
Play를 누르고 기둥 주위를 돌아 부엉이 아래로 걸어간 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
// FlatExtensions: FlatDistance와 FaceFlat
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.