Console.Log

C# Extensions Method를 Unity에 활용하기 본문

프로그래밍/Unity

C# Extensions Method를 Unity에 활용하기

Youngchangoon 2018. 10. 24. 06:35

C# Extensions Method


C# 3.0부터 추가된 기능입니다. 이 기능을 사용하게 되면 기존 형식을 확장, 수정하지 않고도 메소드를 추가할 수 있습니다. Microsoft .NET 문서 에선 일반 메서드를 호출하나 Extensions Method를 호출하나 명백한 차이가 없다고 서술하고 있습니다.



사용용도


이 기능은 어느 클래스에나 사용할 수 있기 때문에 특정한 범위에서 사용하는 것이 좋습니다. 일반적으로 상속이 불가능한 (봉인된(sealed)) 클래스에 필요한 기능을 추가할 수 없을 때가 가장 적합한것 같습니다.


사용방법


확장 메소드의 사용방법은 생각보다 간단합니다. String 클래스에 단어갯수를 확인하는 확장 메소드를 만들어보겠습니다. 


1
2
3
4
5
6
7
8
9
10
11
namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static int WordCount(this String str)
        {
            return str.Split(new char[] { ' ''.''?' }, 
                             StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }   
}
cs


이렇게 static 클래스를 만들고 정의해주게 되면, string 객체를 사용하면서 추가로 WordCount라는 함수가 생기게 되고,

일반 string 내장 함수처럼 사용할 수 있게됩니다.


++ Extensions Method의 생성 조건


1. 클래스는 static으로 선언해줍니다. ( 자동으로 함수도 static )

2. 매개변수의 첫 번째는 this와 해당 메소드가 들어갈 타입을 적어줍니다.



기타 설명 

더 자세한건 [Microsoft .NET 문서](https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/extension-methods#general-guidelines) 를 참고하길 바랍니다~



Unity + Extensions Method


이 기능을 유니티에 가져와 적용해본다면 기존에 불필요하게 했던 작업을 함수 하나로 보기 좋게 정리할 수 있게 됩니다!! ( WOW )


기존에 유니티 기능으로만 사용했을 때 불편한 작업이 있었습니다..


+ transform.position의 x값만 바꾸고 싶을 때

+ Sprite의 Color중 Alpha 값만 바꾸고 싶을 때

+ 배열에서 랜덤을 뽑고 싶을 때 ( 물론 이건 C#이지만..ㅋ )


등등 상황에 따라 더 있겠지만 저런 상황에 Extensions Method 기능을 사용하면 매우 편리합니다.


첫 번째 경우를 가지고 설명하자면 Unity의 Transform 클래스에 Extensions Method를 추가하면 좀 더 코드가 깔끔해지고 보기 편해집니다.


TransformExtensions.cs

1
2
3
4
5
6
7
8
9
10
using UnityEngine;
 
public static class TransformExtensions
{
    public static void SetPositionX(this Transform transform, float x)
    {
        var newPosition = new Vector3(x, transform.position.y, transform.position.z);
        transform.position = newPosition;
    }
}
cs

Test.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using UnityEngine;
 
public class Test : MonoBehaviour
{
    private void Start()
    {
        // 이전의 X값 변경 방법
        transform.position = Vector3.zero;
        Debug.Log("[Basic] Prev: " + transform.position);
        transform.position = new Vector3(20, transform.position.y, transform.position.z);
        Debug.Log("[Basic] Curr: " + transform.position);
 
        // Extensions Method
        transform.position = Vector3.zero;
        Debug.Log("[Extensions] Prev: " + transform.position);
        transform.SetPositionX(20);
        Debug.Log("[Extensions] Curr: " + transform.position);
    }
}
cs


마무리

Extensions Method는 클래스의 수정이 불가능한 부분들에 의한 반복적인 일들을 줄여줄 수 있는 매우 좋은 기능 입니다.

유니티로 개발을 하면서 어쩔 수 없이 반복적이고 불필요한 코드들이 늘어난다면 이 기능을 이용해 리팩토링하는 것도 좋을 것 같습니다.