6개월 유니티 게임 개발일지 : Addressable

hipop1109·2026년 1월 21일

오늘은 어드레서블에 대해 알아보려고 한다

Addressables

유니티가 제공하는 에셋 관리 및 로딩 시스템
기존 리소스, 에셋번들 문제를 개선해 주소 기반으로 에셋을 로드, 언로드하고 동적 컨텐츠 업데이트까지 가능하게 해주는 구조

  • 에셋이 실제 어떤 위치에 있든 상관없이 문자열 주소(address)로 에셋을 불러오고 관리할 수 있는 시스템
  • 코드가 에셋 번들 구조에 의존하지 않아도 된다는 장점이 있음

기존 방식의 문제점으로는

Resources:

  • 빌드 시 모든 에셋이 포함되어 앱 크기가 불필요하게 커짐
  • 에셋 이름 변경 or 이동 시 참조 깨지기 쉬움
  • 메모리 관리가 수동적, 복잡함
  • 빌드 후 에셋 업데이트 불가능

에셋 번들

  • 구현, 관리 복잡, 오류 발생 가능성 높음
  • 의존성 관리 어려움 (중복 에셋 문제)
  • 빌드 파이프라인 설정이 까다로움

이를 해결하는 것이 Addressable

Addressable을 쓰는 이유

1. 주소 기반 로딩

  • 에셋을 직접 참조하지 않고 문자열 키로 로딩 -> 코드와 에셋을 분리할 수 있음
    -> 에셋을 변경해도 코드를 수정할 필요가 없음

2. 자동 종속성 관리

  • Addressable은 에셋의 의존 관계를 자동으로 파악해 필요한 에셋을 함께 로드 / 언로드함

3. 앱 초기 용량 축소

  • 필요한 에셋만 로컬/원격에서 다운로드 -> 초기 설치 크기 감소, 런타임 컨텐츠 추가 가능

4. 메모리 효율적 관리

  • 로딩된 에셋은 레퍼런스 카운팅으로 관리, 필요없어지면 안전하게 언로드 가능

5. 빠른 개발, 테스트 반복

  • 에디터에서 빌드 없어도 플레이 모드에서 실제 addressable 로딩 시뮬레이션 가능

6. 에셋번들의 단점 보완

  • 에셋번들의 하드코딩, 번들 종속성 문제 등을 해결 가능

7. 동적 콘텐츠 업데이트

  • 앱 재배포 및 재빌드 없이 원격 서버의 에셋 번들을 업데이트해 게임 컨텐츠를 동적으로 추가하거나 수정 가능

Addressable의 주요 개념 이해하기

1. 주소(Address)

  • 각 에셋을 식별하는 고유한 문자열 키
  • 파일 경로, GUID, 또는 사용자 정의 문자열 등 다양한 형태 지정 가능
  • 이 주소를 통해 런타임에 에셋을 로드함

2. 레이블(Label)

  • 하나 이상의 주소에 할당할 수 있는 태그
  • 특정 카테고리의 에셋들을 그룹화 -> 한번에 로드하는 데 유용함

3. 어드레서블 그룹(Addressable Group)

  • 에셋 번들을 빌드하는 단위
  • 어떤 에셋을 어떤 번들에 포함시키고, 어떻게 빌드, 로드할지 설정
  • Local / Remote, 압축 방식 등 결정

4. 에셋 레퍼런스 (AssetReference)

  • 어드레서블 에셋에 대한 직렬화 가능한 참조
  • 인스펙터창에서 직접 어드레서블 에셋 할당 -> 코드에서는 이 참조를 통해 에셋 로드 가능
  • AssetReferenceGameObject 등 특정 타입에 대한 참조도 제공

5. 카탈로그 (Catalog)

  • 어드레서블 에셋의 주소, 레이블, 번들 정보 등을 담고 있는 메타데이터 파일
  • 런타임에 이 카탈로그를 로드 -> 어떤 에셋을 어디서 가져올지 결정
  • catalog.json, catalog.hash

6. 프로필 (Profile)

  • 빌드 및 로드 경로 관련 변수들을 관리하는 설정세트
  • 로컬빌드, 개발서버, 운영서버 등 다양한 환경에 맞는 경로 설정을 쉽게 전환 가능

사용법

1. 로컬 기준


우선 어드레서블을 깐다


그 후 저 루트로 들어가 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 : 체크 시 콘텐츠 업데이트 대상에서 제외 -> 패치 불가

사실 뭐 이런것도 중요하지만 그래도 중요한건 일단 어떻게 쓰느냐인거니까
이 부분은 내일 한번 쫙 정리해서 실전 사용을 목적으로 해보도록 하겠다

profile
쑥쑥 개발자

0개의 댓글