반응형
아래와 같은 코드 발견.. 신기
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를 써준다.
반응형
'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 |