Unity의 **Addressable Asset System(어드레서블)**은 게임 개발 시 리소스 관리와 빌드, 로딩을 유연하게 제어하기 위해 도입된 에셋 관리 시스템이다. Addressables은 Unity가 기존에 제공하던 Resources, AssetBundle, SceneManager.LoadScene() 등의 리소스 로딩 기법의 한계를 극복하기 위해 만들어진 고수준 API이며, 특히 대규모 프로젝트나 LiveOps 환경에서 리소스 최적화, 동적 로딩, 패치 관리 측면에서 강력한 기능을 제공한다.
1. Addressables의 핵심 개념
어드레서블 시스템은 "이름을 통해 에셋을 참조"하는 구조이다. 프로젝트 내 에셋들에 대해 Addressable이라는 라벨을 부여하면, 해당 리소스를 이름(string), 라벨, 또는 그룹 단위로 런타임에 비동기적으로 로딩할 수 있게 된다.
// Address로 로딩
Addressables.LoadAssetAsync<GameObject>("EnemyPrefab").Completed += handle => {
GameObject enemy = handle.Result;
Instantiate(enemy);
};
에셋은 그룹 단위로 빌드되며, 그룹 설정을 통해 어떤 리소스를 로컬에 포함할지, 혹은 원격에서 다운로드할지 제어할 수 있다. 덕분에 앱 크기 최적화 및 패치 전략 수립이 용이하다.
2. 기존 기술과의 비교
| 항목 | Resources | AssetBundle | Addressables |
| 사용 편의성 | 매우 쉬움 | 낮음 | 중간 |
| 빌드 자동화 | 자동 포함 (제어 불가) | 수동 빌드 필요 | 자동 빌드 및 그룹 기반 |
| 동적 로딩 | 가능 | 가능 | 가능 |
| 메모리 관리 | 자동 언로드 어려움 | 수동 관리 | 자동 레퍼런스 관리 가능 |
| 의존성 처리 | 없음 | 수동 처리 | 자동 처리 가능 |
| 패치 지원 | 불가 | 가능 | 가능 (Remote Group) |
| Scene 로딩 | LoadScene() | AssetBundle.LoadScene() | Addressables.LoadSceneAsync() |
| 유지보수 | 대형 프로젝트에서 비추천 | 고도 기술 요구 | 공식 권장 시스템 |
Resources
- 빌드에 포함 여부를 개발자가 제어할 수 없고, 불필요한 메모리 점유가 잦다.
- 프로덕션 환경에서 권장되지 않는다.
AssetBundle
- Addressables의 하위 시스템.
- 강력하지만 API가 저수준이며 관리가 어렵고, 의존성 처리나 레퍼런스 유지가 번거롭다.
Addressables
- AssetBundle 위에 구성된 고수준 인터페이스로, 의존성 자동 처리, 레퍼런스 추적, 사용량 기반 자동 언로드 등을 지원한다.
- 또한 Catalog 기반 구조를 사용하여, 원격 CDN에서 에셋을 동적으로 다운로드하거나, Hotfix 형태의 업데이트를 쉽게 적용할 수 있다.
3. Addressables의 장점 요약
- 에셋 동적 로딩 및 언로드 자동화 지원.
- 리소스 분리 배포 및 CDN 연동 가능.
- 복잡한 의존성 관리 자동화.
- 에셋 라벨링, 그룹 구성, 빌드 전략 분리.
- 에디터 환경에서의 모의 로딩, 실제 빌드 간 전환 기능.
4. 단점 및 주의사항
- API 호출이 비동기 기반이므로 코드 흐름 제어에 주의가 필요하다.
- Addressables 시스템 자체가 학습 곡선이 존재하며, 초기 설정이 복잡하다.
- 로딩 에러 발생 시 디버깅이 다소 번거롭고, Catalog 갱신에 대한 이해가 필요하다.
결론
Addressables는 Unity의 리소스 관리 시스템의 현대화된 표준으로, 복잡한 프로젝트일수록 강력한 이점을 제공한다. 단순한 로컬 게임이라면 Resources 또는 SceneManager 기반의 방식도 가능하지만, 유지보수성과 확장성을 고려할 때 Addressables은 필수적인 선택이 될 수 있다. 특히, 라이브 업데이트나 DLC 구조를 염두에 두고 있다면, Addressables의 도입은 더 이상 선택이 아니라 전제 조건에 가깝다고 볼 수 있다.
'소프트웨어 공학 > 코딩' 카테고리의 다른 글
| Unity] GetComponent를 최소한으로 사용해야하는 이유 (0) | 2025.04.22 |
|---|---|
| Unity] Assembly Definition (0) | 2025.04.21 |
| C#] 레코드(record)란? (0) | 2025.04.16 |
| Utility AI (0) | 2025.04.06 |
| 클래스 관계의 종류와 객체지향 설계에서의 활용 (0) | 2025.03.17 |