이번 글에는 AssetBundle & Addressable에 대해 정리를 해보려 한다.
앱을 배포하고 규모가 커지다보면
다음과 같은 문제가 발생하게 될 것이다.
- 빌드 파일 용량 증가
모든 리소스를 하나의 빌드에 포함하면 용량이 커지고, 배포가 어려워진다.
ex: 모바일 게임에서 신규 캐릭터를 추가하려면 전체 앱을 다시 빌드해야 하는 문제 - 앱 업데이트 문제
이미지 하나만 바꿔도 전체 앱을 다시 배포해야 하는 상황이 발생할 수 있다.
ex: 시즌 이벤트 리소스를 교체할 때마다 앱 업데이트 필요 - 리소스 낭비
앱 시작 시 모든 리소스를 미리 메모리에 올리면 성능 저하가 발생한다.
ex: 초기 UI 리소스만 필요한데도 전체 리소스를 로딩
이러한 문제들을 해결하고자 할 때 바로 이 AssetBundle & Addressable를 사용하는 것이다!
그럼 이제 AssetBundle과 Addressable이 정확히 어떤 역할을 하는 지 알아보자
1. AssetBundle이란?🤔
Unity 리소스(이미지, 오디오, 프리팹 등)를 묶어 놓은 외부 패키지
- 필요한 시점에 다운로드해서 메모리에 로드
- 앱의 용량 감소, 유연한 업데이트 가능
❗필요한 리소스만 로드, 패치 시 전체 앱 빌드 없이 일부 리소스만 교체가 가능
2. Addressable 이란?🤔
AssetBundle의 개념을 자동화하고 더 쉽게 쓸 수 있게 만든 Unity의 새로운 시스템
- 에셋의 주소 기반 로드 (LoadAssetAsync("Assets/Some.prefab"))
- 자동 AssetBundle 빌드 및 의존성 관리
- 로컬/서버에서 에셋 로딩도 통합 관리
❗ AssetBundle보다 간편하게 사용 가능, 캐싱/의존성 자동 처리, Unity 에디터 내에서 GUI로 리소스 그룹 설정 가능
3. AssetBundle vs Addressable 핵심 비교
항목 | AssetBundle | Addressable |
설정 방식 | 코드 기반 수동 구성 | 에디터 UI 기반 자동 구성 |
로딩 방식 | AssetBundle.LoadFromFile() 등 | Addressables.LoadAssetAsync() |
의존성 관리 | 직접 관리 | 자동 관리 |
버전 관리 / 캐싱 | 직접 구현 | 자동 제공 (캐시, 해시 기반) |
권장 사용 시점 | 상세하게 커스텀이 필요한 시스템일 때 | 대부분의 프로젝트에서 추천 |
4. Addressable 사용 방법
AssetBundle은 많이 사용해보았기 때문에 Addressable을 사용해보겠다.
1단계 - 에셋 등록 (Editor에서 진행)
: 어떤 에셋을 Addressable로 관리할 것인지 지정하는 단계
(1) Package Manager에서 Addressable 검색하여 Install
(2) Window - Asset Management - Addressables - Groups
(3) Create Addressables Settings (아래 팝업창은 기존에 AssetBundle을 사용하고 있어 변경하겠냐는 메시지!)
Convert : 기존 AssetBundle 설정이 제거되고, 같은 이름의 Addressables Group으로 변환이 된다
Ignore : 기존 설정은 유지, Addressables는 새로 구성
(4) Addressable 설정 방법 (그룹 이름은 파일 경로나 직관적으로)
=> 이렇게 하면 씬 단위로 필요한 리소스만 선택적 로딩할 수 있어 메모리 최적화에 유리
2단계 - Build (실제 번들로 묶는 과정)
: 에셋들을 실제로 번들 파일로 생성하는 단계
(1) Addressables Groups > Build > New Build > Default Build Script
빌드가 끝나면 프로젝트 경로 내 Library/com.unity.addressables 번들 파일이 생성된다.
❗ 언제 다시 Build를 해야 할까?
- 새로운 에셋을 Addressables에 등록할 때
- 기존 에셋을 수정했을 때 (UI, 이미지 변경 등)
- 주소를 변경했을 때
단, 코드를 변경했을 때에는 안해도 된다!
3단계 - Load (코드로 리소스를 불러오는 작업)
: 런타임에 메모리를 불러와서 사용하는 코드 작업
(추가적으로 나는 Addressable 로드/해제 관리용으로 매니저 스크립트를 만들었다.)
// 프리팹 로드하고 생성하기
AddressableManager.Instance.Load<GameObject>("DateCourseItem", prefab =>
{
Instantiate(prefab, parentTransform);
});
// 해제
AddressableManager.Instance.Release("DateCourseItem");
// 전체 해제 (씬 전환 시)
AddressableManager.Instance.ReleaseAll();
이런식으로 진행하여 각 씬 진입 시 필요한 에셋만 로드하고, 나갈 때 ReleaseAll()로 정리할 수 있다.
Addressables는 "등록 + 빌드 + 로드"가 하나의 세트!!
❗AddressableManager.cs를 도입한 이유
: Addressables는 기본적으로 `LoadAssetAsync`와 `Release`를 통해 리소스를 관리하지만, 이걸 여러 곳에서 사용할 경우 중복 코드가 생기기 쉽다.
그래서 로딩/해제를 일원화하기 위해 싱글톤 매니저 클래스를 도입,
캐싱, 예외처리, 전체 해제 기능까지 포함하여 Addressables를 더 깔끔하게 사용할 수 있도록 구성
❓진행하면서 궁금했던 사항들 정리❓
Q. 에셋을 Addressables로 등록만 하면 앱에서 자동으로 로드되나?
A. NO!
Addressable 등록 + 빌드만으로는 "리소스를 사용할 준비"까지만 되는 것이다.
실제 사용하려면 LoadAssetAsync로 명시적으로 불러와야 메모리에 올라간다.
Q. 이미 로드된 에셋을 또 LoadAssetAsync 하면 중복 로딩 되는 건가? ?
A. NO!
Addressables는 자동 캐싱되어 있어, 이미 로드된 에셋은 재사용한다.
해제는 Addressables.Release()로 수동 해제해줘야 메모리 정리가 된다.

AssetBundle : 리소스를 묶고 직접 로드하는 수동 방식, 설정과 관리가 복잡하지만 유연성이 높다
Addressable : AssetBundle을 자동으로 관리해주는 시스템, 에셋 로딩과 의존성 처리까지 간편하게 구현이 가능!
'Unity 개발 > 기술 향상' 카테고리의 다른 글
[Unity] ScriptableObject 개념 정리 (0) | 2025.03.04 |
---|---|
[Unity] Unity에서 DLL과 Assembly Definition을 활용한 최적화 전략 (0) | 2025.03.03 |
[Unity] Async/Await과 Coroutine의 차이점 (0) | 2025.02.27 |
[Unity] Google 계정 로그인 연동 (1) | 2024.12.21 |
[Unity] SHA 인증서 가져오기 (릴리즈 배포 환경 인증용) (0) | 2024.12.02 |