
유니티에서 게임을 제작하다 보니, Resources 클래스로 오브젝트를 사용하게 되었다. 그래서, 이번 주제는 Resources 클래스이다.
UnityEngine.Resources 클래스는 빌드된 게임 내에서 동적으로 에셋을 로드할 수 있게 해주는 유틸리티 클래스이다. 이를 사용하기 위해서는 아래와 같이 Assets/Resources 폴더 안에 리소스를 저장해주어야 한다.
Assets/
└── Resources/
├── Prefabs/
│ └── Monster.prefab
└── Audio/
└── BGM.mp3
Resources 폴더에서 오브젝트를 로드하는 메서드는 다음과 같다.
// 프리팹 로드
GameObject monster = Resources.Load<GameObject>("Prefabs/Monster");
// 텍스처 로드
Texture2D tex = Resources.Load<Texture2D>("Textures/Grass");
// 오디오 클립 로드
AudioClip clip = Resources.Load<AudioClip>("Audio/BGM");
개발자가 사용하기에는 정말 편리해 보이지만, 문제점이 존재한다.
메모리 누수 : Load() 메서드를 사용한 리소스는 직접 해제해주지 않으면 계속 메모리에 남아 있다. 즉, 사용이 끝나면 UnloadAsset() 메서드를 통해 직접 언로딩을 해주어야 한다. 혹은 UnloadUnusedAssets() 메서드를 통해 사용하지 않는 모든 리소스를 정리할 수 있다.
Resources 폴더 빌드 포함 : Resources 폴더 안 리소스는 압축되지 않은 채로 빌드가 되기 때문에 빌드의 용량이 그만큼 증가하게 된다.
리소스 직접 해제 : 위에서 말한 것과 같이 수동으로 메서드를 사용해서 불러온 리소스를 직접 해제해야 되는 번거로움이 있다.
주소 기반 관리 : Load() 메서드의 인자가 문자열로 되어 있기 때문에 관리에 취약하다.
따라서, Resources 클래스는 가능한 소규모 프로젝트나 프로토타입에서만 사용하는 편이 좋다. 이와 비슷한 기능을 사용하고 싶다면, Addressables 시스템을 사용하는 것이 좋다. 이는 Resources 클래스 보완을 위해 나온 AssetBundle 시스템의 업그레이드 버전이라고 생각하면 된다. 사용 방법은 아직 나도 잘 몰라서(;;) 다음 시간에 알려주겠다.