Unity/정보

[Unity] 확장메서드

달시_Dalsi 2025. 3. 23. 19:21
728x90

Unity 개발을 하다 보면 특정 기능을 여러 스크립트에서 반복적으로 사용해야 하는 경우가 많습니다. 이때 확장 메서드(Extension Method) 를 활용하면 기존 클래스의 코드를 수정하지 않고도 기능을 추가할 수 있어 코드의 재사용성과 가독성을 크게 향상시킬 수 있습니다.

 


1. 확장 메서드란?

확장 메서드는 C#의 기능 중 하나로, 기존 클래스의 코드를 수정하지 않고도 새로운 메서드를 추가할 수 있는 기능입니다. 주로 static 클래스를 이용하여 특정 타입(클래스, 구조체 등)에 새로운 메서드를 정의할 수 있습니다.

 

확장 메서드의 특징

  • 기존 클래스를 수정하지 않고도 새로운 기능 추가 가능
  • static 클래스를 사용하며, 확장 대상 메서드는 this 키워드를 사용하여 정의
  • 재사용성이 높아 코드 중복을 줄일 수 있음

 


2. 확장 메서드 사용법

 

기본적인 확장 메서드 예제

public static class Extensions
{
    public static void ResetTransform(this Transform transform)
    {
        transform.position = Vector3.zero;
        transform.rotation = Quaternion.identity;
        transform.localScale = Vector3.one;
    }
}

 

코드 설명

  • Extensions라는 static 클래스를 만듦
  • ResetTransform이라는 확장 메서드를 정의하며 this Transform transform을 사용하여 Transform 클래스의 인스턴스를 확장
  • transform.position, rotation, localScale을 초기화하는 기능을 추가

이제 Unity에서 Transform 컴포넌트를 가진 오브젝트에서 아래처럼 간단히 사용할 수 있습니다.

void Start()
{
    transform.ResetTransform();
}

이렇게 하면 transform을 간단하게 초기화할 수 있습니다.

 

3. Unity에서 활용하기

확장 메서드는 Unity에서 다양한 방식으로 활용될 수 있습니다. 아래에 몇가지 예제를 만들어봤습니다.

 

1) 벡터 연산을 쉽게 처리하는 확장 메서드

public static class Extensions
{
    public static Vector3 WithX(this Vector3 vector, float x)
    {
        return new Vector3(x, vector.y, vector.z);
    }
    
    public static Vector3 WithY(this Vector3 vector, float y)
    {
        return new Vector3(vector.x, y, vector.z);
    }
}

 

사용 예시:

Vector3 newPosition = transform.position.WithX(5f); // X 값만 변경

 

 

3) UI 텍스트 자동 업데이트

public static class Extensions
{
    public static void SetTextColor(this Text text, Color color)
    {
        if (text != null)
        {
            text.color = color;
        }
    }
}

 

사용 예시:

myText.SetTextColor(Color.red); // 텍스트 색상을 빨간색으로 변경

 

 

4) 배열 및 리스트 관련 확장 메서드 추가

피셔-예이츠 알고리즘을 이용한 배열/리스트 셔플

public static class Extensions
{
    public static void Shuffle<T>(this IList<T> list)
    {
        int n = list.Count;
        for (int i = n - 1; i > 0; i--)
        {
            int j = Random.Range(0, i + 1);
            (list[i], list[j]) = (list[j], list[i]);
        }
    }
}

 

사용 예시:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
numbers.Shuffle(); // 리스트를 무작위로 섞음

 

 

배열/리스트에서 랜덤 요소 1개 선택하기

public static class Extensions
{
    public static T GetRandomElement<T>(this IList<T> list)
    {
        if (list == null || list.Count == 0)
            return default;
        return list[Random.Range(0, list.Count)];
    }
}

 

사용 예시:

List<string> names = new List<string> { "철수", "영희", "맹구" };
string randomName = names.GetRandomElement(); // 리스트에서 랜덤하게 하나 선택

 


4. 확장 메서드를 사용할 때 주의할 점

  • 남용하면 가독성이 저하될 수 있음
  • 클래스의 멤버 함수와 동일한 이름을 사용하지 않도록 주의
  • Null 체크를 반드시 포함해야 안전한 코드 작성 가능

5. 정리

  • 확장 메서드는 기존 클래스의 기능을 확장하는 강력한 도구
  • Unity에서 Transform, Vector3, GameObject 등 다양한 컴포넌트 확장 가능
  • 반복되는 코드 줄이고 유지보수를 쉽게 할 수 있음
  • 배열 및 리스트 관련 메서드도 확장 가능하여 편리한 데이터 조작 가능
  • Null 체크와 가독성을 고려하여 적절히 활용하는 것이 중요
728x90