C#의 확장 메서드는 모든 클래스의 기능을 확장할 수 있는 메서드이다.
기본적으로 클래스에 extra public method를 추가할 수 있다.
라고 설명해놓지만
사실상 우리가 사용하던 유니티 메서드. 예를 들면. getcomponent<'rigidbody>()
이런 메서드에 우리가 원하는 기능을 추가해서 넣을 수도 있고.
말이 어렵다. 그냥 눈으로 보도록 하자.
public static Vector2 SetX(this Vector2 vector, float x)
{
return new Vector2(x, vector.y);
}
이런 것이 확장 메서드이다.
Static class안에 선언해야 하며 instance로 선언한 것과 뭐가 다르냐면
instance는 (이름).instance를 무조건 경유해야하는데 이 친구는 그런 게 없다.
Vector2 ex = Vector2.one;
Vector2 ex_ = ex.Setx(0);
이런 식으로 사용할 수 있다. 굳이 instance라던가 쓸데 없는 것을 경유 안해도 됨.
자료형은 맞춰야하며.
기본적으로 public static (반환되는 자료형) (메서드 이름) = (this 자료형에 맞는 매개변수, 매개 변수 , 매개 변수 , ~~~)
자료형에 맞는 매개 변수는 그냥 설명하기 편하게 해놓은 건데. 사실 위에 코드에서 Setx앞의 ex를 의미하는 것이다. 저 친구가 Vector3 형의 매개변수로 설정한다면 ex도 Vector3일 경우에 위 함수를 사용 가능하다.
실행하면 아마 ex_는 (0,1)의 값을 가질 것이다.
제네릭도 사용 가능하다.
public static T GetOrAddComponent<T>(this GameObject gameObject) where T : MonoBehaviour
{
var component = gameObject.GetComponent<T>();
if (component == null) gameObject.AddComponent<T>();
return component;
}
이건 우리가 쓰는 getcomponent<>()형식과 같다.
호출할려면.
Gameobject game;
game.GetOrAddComponent<리지드 바디라던가 여러가지>();
이런 식으로 호출하면 된다
함수 내용을 해석하면 T타입이 있으면 가져오고 없으면 컴포턴트로 추가해라.
<>안의 매개변수 T, 즉 들어오는 자료형으로 반환하는데 T는 where문에 의해 MonoBehaviour에 해당하는 타입만 가능하다. 이런식이다.
리지드 바디나 여러가지에도 적용 가능
public static T GetRandomItem<T>(this IList<T> list)
{
return list[Random.Range(0, list.Count)];
}
public static void Shuffle<T>(this IList<T> list)
{
for (var i = list.Count - 1; i > 1; i--)
{
var j = Random.Range(0, i + 1);
var value = list[j];
list[j] = list[i];
list[i] = value;
}
}
public static void ChangeDirection(this Rigidbody rb, Vector3 direction)
{
rb.velocity = direction.normalized * rb.velocity.magnitude;
}