Unity UI Material 관리하기: 메모리 누수와 NullReference 예방하기

SSO·2025년 2월 12일

Unity (AI-Generated)

목록 보기
1/3

Unity UI Material 관리하기: 메모리 누수와 NullReference 예방하기

안녕하세요! 오늘은 Unity에서 UI Material 관리의 중요성과 올바른 정리 방법에 대해 알아보겠습니다.

들어가며

Unity로 게임을 개발하다 보면 아래와 같은 에러를 마주치신 적 있으신가요?

Non-fatal Exception: NullReferenceException
0  ???  0x0 UpdateMaterial (TMPro.TMP_SubMeshUI)

이런 에러는 대부분 UI 요소들의 Material이 제대로 정리되지 않아서 발생합니다. 왜 이런 일이 발생하는지, 어떻게 해결할 수 있는지 하나씩 알아보겠습니다.

Material이란?

Material은 쉽게 말해서 게임 오브젝트의 '외관'을 결정하는 요소입니다. 우리가 입는 옷이나 피부처럼, 게임 오브젝트가 어떻게 보일지를 결정하죠.

UI 요소들(텍스트, 이미지 등)도 각각의 Material을 가지고 있어서, 이를 통해 화면에 표시됩니다.

문제 상황

씬 전환 시 흔히 발생하는 상황을 보겠습니다:

  1. 씬A에서 TextMeshPro로 텍스트를 표시 중
  2. 씬B로 전환
  3. 씬A의 텍스트가 제거되면서 Material 참조가 깨짐
  4. 메모리에 정리되지 않은 Material이 남음

이렇게 되면 두 가지 문제가 발생합니다:

  • 메모리 누수 (Memory Leak)
  • NullReference 예외 발생

해결 방법

아래 코드를 통해 UI 요소들을 깔끔하게 정리할 수 있습니다:

public void CleanupUIElements()
{
    // TMP 컴포넌트 정리
    TextMeshProUGUI[] tmpTexts = FindObjectsOfType<TextMeshProUGUI>();
    foreach (var tmp in tmpTexts)
    {
        if (tmp != null)
        {
            tmp.SetMaterialDirty();
            tmp.SetVerticesDirty();
        }
    }

    // 일반 UI 요소 정리
    MaskableGraphic[] graphics = FindObjectsOfType<MaskableGraphic>();
    foreach (var graphic in graphics)
    {
        if (graphic != null)
        {
            graphic.SetMaterialDirty();
        }
    }
}

코드 설명

  1. SetMaterialDirty()

    • Material이 변경되었음을 Unity에 알림
    • Unity가 다음 프레임에서 Material을 새로 고치도록 함
  2. SetVerticesDirty()

    • 텍스트의 메시(형태)가 변경되었음을 알림
    • 텍스트 표시 관련 메모리를 정리

사용 시점

이 정리 코드는 주로 다음 상황에서 사용합니다:

  • 씬 전환 직전
  • UI 요소가 많이 변경되는 경우
  • 메모리 사용량을 최적화하고 싶을 때

실제 적용 예시

public void LoadScene(string sceneName)
{
    // 씬 전환 전에 UI 정리
    CleanupUIElements();
    
    // 씬 로드
    SceneManager.LoadScene(sceneName);
}

마치며

UI Material 관리는 게임의 안정성과 성능에 큰 영향을 미칩니다. 특히 모바일 게임에서는 메모리 관리가 더욱 중요하므로, 이러한 정리 작업을 잊지 말고 수행해주세요.

다음에는 Unity의 메모리 프로파일링 도구를 사용해서 메모리 누수를 찾아내는 방법에 대해 알아보도록 하겠습니다.

참고 자료


이 글은 AI(Claude)가 작성한 내용입니다. 실제 프로젝트에 적용하기 전에 공식 문서를 참고하시기를 권장드립니다.
코드 예제나 설명에서 부정확한 부분을 발견하시면 댓글로 알려주시면 감사하겠습니다.
여러분의 피드백은 더 나은 콘텐츠를 만드는데 큰 도움이 됩니다.

0개의 댓글