Unity/Unity 리서치

C# 확장매소드(Extension Method)

lipnus 2023. 2. 16. 20:39
반응형

아래와 같은 코드 발견.. 신기

protected override void Pick(GameObject picker)
{
    Character character = picker.gameObject.MMGetComponentNoAlloc<Character>();
    if (OnlyForPlayerCharacter && (character != null) && (_character.CharacterType != Character.CharacterTypes.Player))
    {
        return;
    }

    Health characterHealth = picker.gameObject.MMGetComponentNoAlloc<Health>();
    // else, we give health to the player
    if (characterHealth != null)
    {
        characterHealth.ReceiveHealth(HealthToGive, gameObject);
    }            
}

 

GameObjectExtensions.cs

public static class GameObjectExtensions
{
    static List<Component> m_ComponentCache = new List<Component>();

    public static Component Fuck(this GameObject @this, System.Type componentType)
    {
        return null;
    }

    /// <summary>
    /// Grabs a component without allocating memory uselessly
    /// </summary>
    /// <param name="this"></param>
    /// <param name="componentType"></param>
    /// <returns></returns>
    public static Component MMGetComponentNoAlloc(this GameObject @this, System.Type componentType)
    {
        @this.GetComponents(componentType, m_ComponentCache);
        Component component = m_ComponentCache.Count > 0 ? m_ComponentCache[0] : null;
        m_ComponentCache.Clear();
        return component;
    }

    /// <summary>
    /// Grabs a component without allocating memory uselessly
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="this"></param>
    /// <returns></returns>
    public static T MMGetComponentNoAlloc<T>(this GameObject @this) where T : Component
    {
        @this.GetComponents(typeof(T), m_ComponentCache);
        Component component = m_ComponentCache.Count > 0 ? m_ComponentCache[0] : null;
        m_ComponentCache.Clear();
        return component as T;
    }

    /// <summary>
    /// Grabs a component on the object, or on its children objects, or on a parent, or adds it to the object if none were found
    /// </summary>
    /// <param name="this"></param>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static T MMGetComponentAroundOrAdd<T>(this GameObject @this) where T : Component
    {
        T component = @this.GetComponentInChildren<T>(true);
        if (component == null)
        {
            component = @this.GetComponentInParent<T>();    
        }
        if (component == null)
        {
            component = @this.AddComponent<T>();    
        }
        return component;
    }
}

 

마치 GameObject를 확장한 것처럼 사용할 수 있다.

 

📌Extension 확장 메서드

특수한 종류의 static 메서드인데, 마치 다른 클래스의 메서드인 것 처럼 호출해 사용할 수 있다.

  • 확장 메서드는 static 클래스 안에 static 메서드로 정의한다.
  • 확장 메서드의 첫 번째 매개 변수가 바로 그 다른 클래스의 메서드인 것처럼 호출할 수 있는 그 호출의 주체로 정의한다.
    • 첫 번째 매개변수 앞에 this를 써준다.

 

 

https://ansohxxn.github.io/c%20sharp/extension/

반응형

'Unity > Unity 리서치' 카테고리의 다른 글

DontDestroyOnLoad의 적용범위  (0) 2023.03.20
Unity 포물선 발사체  (0) 2023.03.04
gameObject에 SendMessage 보내기  (0) 2023.01.25
Enum을 활용한 Bit연산자 Flag  (0) 2023.01.24
Collider2D, Collider 상속 관계  (0) 2023.01.23