[Unity] Resources.Load로 런타임에 에셋을 동적으로 불러오는 방법

식혜드식혜·2025년 4월 22일

Unity

목록 보기
2/6

Resources 클래스란?

Resources 클래스는 런타임 중 Resources 폴더에 위치한 에셋을 동적으로 불러오는 데 사용된다.

  • Resources.Load, Resources.LoadAsync 등을 통해 에셋 로드가 가능하다.
  • 에디터에서는 Resources.FindObjectOfTypeAll을 통해 에셋 검색이 가능하다.
  • Resources 폴더는 Assets 내부 어디에서나 위치할 수 있으며, 여러 개 존재해도 된다.

⚠️주의할 점
Resources 폴더는 직접 생성해야 하며, 새 프로젝트에 자동으로 포함되지 않는다.

Resources.Load 사용법

기본 문법

public static Object Load(string path);
public static T Load<T>(string path) where T : Object;
  • 경로는 Resources 폴더를 기준으로 작성하면 된다.
  • 확장자는 생략한다. (.png, .prefab 등)
  • 대소문자 구분이 없다.
  • 슬래시(/)로 하위 폴더를 접근할 수 있다.

예제

GameObject go = Resources.Load<GameObject>("Prefabs/MyPrefab");
Texture2D tex = Resources.Load<Texture2D>("Textures/Glass");
AudioClip clip = Resources.Load<AudioClip>("Audio/Explosion");

가급적이면 제네릭을 사용하는 것이 타입 안정성과 가독성 측면에서 더 좋다.

Resources.Load의 장단점

장점

  • 인스펙터에 의존하지 않고 동적으로 에셋을 로드 가능하다.

  • 상황에 따라 편리하다.

    <상황 예시>
    스크립트에서 에셋을 동적으로 선택해야 할 때:
    캐릭터가 입는 옷 종류가 20가지고, 런타임에 선택된 옷에 따라 텍스처를 바꿔야 한다면?
    Resources.Load("Clothes/" + selectedName)처럼 문자열만으로 동적으로 불러올 수 있다.)

단점

  • Resources 폴더의 모든 에셋이 빌드에 포함 -> 앱 용량 증가
  • 에셋 주소 하드코딩 -> 유지보수 어려움
  • 메모리 관리가 어려움 -> 필요 없어진 에셋은 직접 언로드 필요

메모리 관리: Resources.UnloadUnusedAssets

메모리에서 더 이상 참조되지 않는 에셋들을 언로드(제거)해주는 함수이다.
비동기 함수이므로 yield return과 함께 쓰는 게 일반적이다.

yield return Resources.UnloadUnusedAssets();
  • Resources.Load()를 했지만 어떤 GameObject나 ScriptableObject도 실제로 참조한 적이 없다면,
    Unity는 “이 리소스가 아직 사용 중일 수 있음”으로 판단해서 메모리에서 유지한다.
  • 언로드 대상이 되려면, Load()로 한 번 이상 로드되었고 그걸 참조하던 모든 객체가 Destroy되거나 참조를 해제해야 한다.

주요 메서드 정리

메서드설명
Resources.Load<T>(path)지정한 경로의 에셋을 로드한다. (제네릭 사용 권장)
Resources.LoadAll<T>(path)경로 내 모든 에셋을 배열로 로드한다.
Resources.LoadAsync<T>(path)비동기로 에셋을 로드한다. 로딩 시간 동안 앱이 멈추지 않게 할 수 있다.
Resources.UnloadUnusedAssets()사용되지 않는 에셋을 메모리에서 해제한다.
Resources.FindObjectsOfTypeAll<T>()해당 타입의 모든 오브젝트를 반환한다. (에디터 전용)

전체 예제

using UnityEngine;

public class ExampleClass : MonoBehaviour
{
    void Start()
    {
        GameObject go = GameObject.CreatePrimitive(PrimitiveType.Plane);
        Renderer rend = go.GetComponent<Renderer>();
        rend.material.mainTexture = Resources.Load("glass") as Texture;
    }
}

"glass"는 Resources 폴더 내 텍스처이며, 형변환 없이 Resources.Load("glass")처럼 제네릭으로 사용하는 게 더 안전하다.

profile
안녕하세요! 유니티 공부 중인 고3 학생입니다

0개의 댓글