내일배움캠프

내일배움캠프 Unity - TIL : 25.03.05

달시_Dalsi 2025. 3. 5. 21:59
728x90

오늘 학습한 내용

1) 제네릭 캐싱을 통한 GetComponent 최소화

캐릭터가 적을 공격할 때, OnColliderEnter 같은 이벤트를 이용해 적의 콜라이더를 감지하고, 해당 콜라이더에 부착된 적 스크립트를 가져와 데미지를 주는 과정에서 매번 GetComponent를 호출하면 성능에 부담이 생길 수 있습니다.
제네릭을 활용한 캐싱 방식을 사용하면, 한 번 호출한 GetComponent의 결과를 저장해두고 재사용할 수 있어, 코드의 효율성과 성능이 크게 향상된다는 것을 배웠습니다.

public static class ComponentCache
{
    private static Dictionary<GameObject, Dictionary<Type, Component>> cache = new Dictionary<GameObject, Dictionary<Type, Component>>();

    public static T GetCachedComponent<T>(this GameObject gameObject) where T : Component
    {
        if (!cache.TryGetValue(gameObject, out var compDict))
        {
            compDict = new Dictionary<Type, Component>();
            cache[gameObject] = compDict;
        }
        
        Type type = typeof(T);
        if (!compDict.TryGetValue(type, out Component component))
        {
            component = gameObject.GetComponent<T>();
            compDict[type] = component;
        }
        
        return component as T;
    }
}

문제 및 해결 과정

1) 문제

캐릭터가 적을 공격할 때 적의 콜라이더를 감지하여 적 스크립트를 찾기 위해 GetComponent를 반복 호출하는 과정에서 성능 저하가 발생할 우려가 있었습니다.

 

시도한 해결 방법

제네릭 캐싱 메서드를 구현하여 한 번 호출한 GetComponent 결과를 저장해두고 재사용하는 방식으로 문제를 해결하였습니다.

 

결과

제네릭 캐싱을 적용함으로써 GetComponent 호출을 최소화하고 성능 최적화에 성공하였으며 코드의 재사용성이 크게 향상되었습니다.


새롭게 알게 된 점

제네릭 캐싱의 이점

제네릭 캐싱을 활용하면 기존 클래스를 수정하지 않고도 반복적으로 호출되는 GetComponent를 효율적으로 관리할 수 있어 성능과 코드 재사용성이 크게 증가함을 배웠습니다.

728x90