확장 메서드란 클래스의 기능을 확장할 수 있는 메서드이다.
원래 클래스에 없던 기능을 사용자가 정의하고 구현하여 원래 있던 기능처럼 사용할 수 있도록 해준다.
기본적으로 사용자가 직접 만든 클래스의 경우 새로운 함수를 추가하는건 간단하다.
하지만 기존 클래스를 변경할 수 없는 경우, Sealed로 봉인된 클래스
유니티 내부 클래스처럼 수정을 할 수 없는 경우에 추가 기능을 만들기 위해 사용합니다.
확장 메서드를 사용하기 위해서는 새로운 클래스가 필요하며 이때 정적 클래스여야합니다.
public static class 클래스이름
{
public static 반환타입 메서드이름(this 대상타입 식별명, 매개변수)
{
확장 메서드 내용
}
}
위 코드는 확장 메소드와 그 메서드가 포함되 클래스의 예시입니다.
static으로 정적으로 선언하는 것에 유의합니다.
public static class TransformExtensions
{
public static void ResetPosition(this Transform transform)
{
transform.position = Vector3.zero;
}
}
위와 같이 선언하였을 경우
transform.ResetPosition();
위와 같이 원래의 Transform 클래스의 함수처럼 사용이 가능하다.
특정 클래스를 상속 받는 경우에만 확장 메서드를 사용하도록 할 수 있다.
public static bool HasComponent<T>(this GameObject gameObject) where T : MonoBehaviour
위 부분은 제네릭 타입 T에 대해 제약조건으로 MonoBehaviour를 상속 받은 경우에만 사용가능하도록 합니다.
예를 들어 Rigidbody, CircleCollider와 같이 MonoBehaviour를 상속 받은 오브젝트에 대해서는 사용할 수 있지만 int, float의 경우에는 대입할 수 없다.
해당 코드는 제너릭 T의 문제점을 예방하여 잘못된 타입 사용을 방지 할 수 있다.
public static bool HasComponent<T>(this GameObject gameObject) where T : MonoBehaviour
{
return gameObject.GetComponent<T>() != null;
}
위는 확장메서드의 예시이다.
obj.HasComponent<Rigidbody>();
위와 같이 사용하여 컴포넌트 보유 여부를 알 수 있다.