오늘은 어드레서블에 대해 알아보려고 한다
유니티가 제공하는 에셋 관리 및 로딩 시스템
기존 리소스, 에셋번들 문제를 개선해 주소 기반으로 에셋을 로드, 언로드하고 동적 컨텐츠 업데이트까지 가능하게 해주는 구조
기존 방식의 문제점으로는
Resources:
에셋 번들
이를 해결하는 것이 Addressable
1. 주소 기반 로딩
- 에셋을 직접 참조하지 않고 문자열 키로 로딩 -> 코드와 에셋을 분리할 수 있음
-> 에셋을 변경해도 코드를 수정할 필요가 없음2. 자동 종속성 관리
- Addressable은 에셋의 의존 관계를 자동으로 파악해 필요한 에셋을 함께 로드 / 언로드함
3. 앱 초기 용량 축소
- 필요한 에셋만 로컬/원격에서 다운로드 -> 초기 설치 크기 감소, 런타임 컨텐츠 추가 가능
4. 메모리 효율적 관리
- 로딩된 에셋은 레퍼런스 카운팅으로 관리, 필요없어지면 안전하게 언로드 가능
5. 빠른 개발, 테스트 반복
- 에디터에서 빌드 없어도 플레이 모드에서 실제 addressable 로딩 시뮬레이션 가능
6. 에셋번들의 단점 보완
- 에셋번들의 하드코딩, 번들 종속성 문제 등을 해결 가능
7. 동적 콘텐츠 업데이트
- 앱 재배포 및 재빌드 없이 원격 서버의 에셋 번들을 업데이트해 게임 컨텐츠를 동적으로 추가하거나 수정 가능
1. 주소(Address)
- 각 에셋을 식별하는 고유한 문자열 키
- 파일 경로, GUID, 또는 사용자 정의 문자열 등 다양한 형태 지정 가능
- 이 주소를 통해 런타임에 에셋을 로드함
2. 레이블(Label)
- 하나 이상의 주소에 할당할 수 있는 태그
- 특정 카테고리의 에셋들을 그룹화 -> 한번에 로드하는 데 유용함
3. 어드레서블 그룹(Addressable Group)
- 에셋 번들을 빌드하는 단위
- 어떤 에셋을 어떤 번들에 포함시키고, 어떻게 빌드, 로드할지 설정
- Local / Remote, 압축 방식 등 결정
4. 에셋 레퍼런스 (AssetReference)
- 어드레서블 에셋에 대한 직렬화 가능한 참조
- 인스펙터창에서 직접 어드레서블 에셋 할당 -> 코드에서는 이 참조를 통해 에셋 로드 가능
- AssetReferenceGameObject 등 특정 타입에 대한 참조도 제공
5. 카탈로그 (Catalog)
- 어드레서블 에셋의 주소, 레이블, 번들 정보 등을 담고 있는 메타데이터 파일
- 런타임에 이 카탈로그를 로드 -> 어떤 에셋을 어디서 가져올지 결정
- catalog.json, catalog.hash
6. 프로필 (Profile)
- 빌드 및 로드 경로 관련 변수들을 관리하는 설정세트
- 로컬빌드, 개발서버, 운영서버 등 다양한 환경에 맞는 경로 설정을 쉽게 전환 가능

우선 어드레서블을 깐다

그 후 저 루트로 들어가 Create Addressables Settings을 눌러 넣는다
그 후 에셋 중 머터리얼이 있는 에셋 아래에 강조해둔 Addressable 탭이 뜬다

이를 클릭하면

이런 식으로 디폴트 로컬 그룹에 들어가고 인스펙터에도 적용된다

그 후 어드레서블 그룹 탭을 누르면 인스펙터에 설정들이 뜬다
이 쪽에는 빌드, 로드 경로, 번들링 모드, 압축 방식 등을 적용한다
보통은 로컬 빌드용, 원격 다운로드용 그룹을 분리해 관리하는게 일반적이라고 한다
탭별로 살짝 분석해보자면
Include in Build
- 어드레서블 빌드에 포함할지 여부 결정
Active Profile
- 빌드 / 로드 경로 세트
- Default, Local, Remote, CDN 등 이런 식으로 나눠서 따로 프로필을 만들어 씀
- 이 그룹이 어디서 빌드되고 어디서 로드되느냐를 환경별로 바꾸는 기능
Build and Load Path
- 이 그룹의 빌드, 로드 경로를 지정해줌
- Local일 때는 로컬 생성, 로드 / Remote일 때 서버 생성, 로드
Path Preview
- Build Path : 어드레서블 빌드 결과가 생성되는 실제 위치 (에디터 내부 경로)
- Load Path : 런타임에서 실제로 읽는 경로
- RuntimePath = 플랫폼별 실행 위치- 이 둘이 어긋나면 로딩이 실패함
Advanced Option
Use Default
-체크하면 유니티 기본값으로 고정, 해제하면 아래 탭 이용Asset Bundle Compression
- LZ4 : 빠른 로딩
- LZMA : 압축률이 높고 로딩이 느림
- Uncompressed : 테스트용으로 사용
- 보통 게임 실행 중 로드할 때는 LZ4, 최초 설치는 LZMA를 가끔 쓴다고 함Use Asset Bundle Cache
-다운로드한 번들을 디스크 캐시에 저장
- 재실행 시 다시 다운로드 안함
- 안 켜면 매번 다시 받는 현상이 일어나 활용이 어렵다Cache Clear Behavior
- Clear When Space is Needed in Cache : 캐시 공간 부족할 때만 자동 삭제, 가장 안전
- Clear On Init : 실행할 때마다 캐시 삭제
- Never Clear : 클리어하지 않음Asset Bundle CRC
- Enabled, Including Cached : 번들 무결성 체크, 손상된 파일 로드 방지Bundle Naming Mode
- Append Hash의 경우 번들 이름에 해시값을 추가하는 개념
- 업데이트 시 캐시 충돌을 방지하고 CDN 캐시 갱신 문제를 해결할 수 있음Strip Bundle Download
- 번들 다운로드 시 일부 데이터 제거Include Address in Catalog
- 주소 문자열을 카탈로그에 포함
- 런타임에서 Address -> Asset으로 매핑 가능하다
Include GUIDs in Catalog
- GUID 기반 접근 가능
- 내부 참조 안정성 증대Include Labels in Catalog
- 라벨 기반 로딩 가능Bunlde Mode
- Pack Together : 그룹 전체를 하나의 번들로 쌈
- Pack Separately : 에셋 하나당 번들로 만듬
- Pack Togather By Label : 라벨 기준으로 묶음Content Update Restriction
- Prevent Updates : 체크 시 콘텐츠 업데이트 대상에서 제외 -> 패치 불가
사실 뭐 이런것도 중요하지만 그래도 중요한건 일단 어떻게 쓰느냐인거니까
이 부분은 내일 한번 쫙 정리해서 실전 사용을 목적으로 해보도록 하겠다