Unity 개발/기술 향상

[Unity] AssetBundle과 Addressable

내공부방 2025. 4. 6. 22:57
반응형

이번 글에는 AssetBundle & Addressable에 대해 정리를 해보려 한다.

 

앱을 배포하고 규모가 커지다보면 

다음과 같은 문제가 발생하게 될 것이다.

  1. 빌드 파일 용량 증가
    모든 리소스를 하나의 빌드에 포함하면 용량이 커지고, 배포가 어려워진다.
     ex: 모바일 게임에서 신규 캐릭터를 추가하려면 전체 앱을 다시 빌드해야 하는 문제
  2. 앱 업데이트 문제
    이미지 하나만 바꿔도 전체 앱을 다시 배포해야 하는 상황이 발생할 수 있다.
     ex: 시즌 이벤트 리소스를 교체할 때마다 앱 업데이트 필요
  3. 리소스 낭비
    앱 시작 시 모든 리소스를 미리 메모리에 올리면 성능 저하가 발생한다.
     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을 자동으로 관리해주는 시스템, 에셋 로딩과 의존성 처리까지 간편하게 구현이 가능!

 

반응형