에셋 번들 AssetBundles

    728x90

    AssetBundles

     

    한마디로 에셋들을 묶은 파일

     


    차례

     

    Unity 버전 5....
    최신 버전

     


     

    에셋 번들 빌드

     

    1. 에셋 번들 설정 (번들에 포함시키기)

     

    👉 무조건 이름은 소문자변환

    👉 'None'은 메인 프로젝트와 함께 패키지

    👉 '/'로 폴더 생성 가능, 하위로 번들 선택 가능

    👉 Remove Unused Names 로 사용하지 않는 번들 지우기 (하나하나 지우는 기능은 없는 듯)

    👉 에셋 번들의 완전한 이름 = 번들 이름 + 번들 배리언트

     


     

    *에셋 번들 배리언트란?

     

    - ex) hd, sd

    - 에셋 번들의 종류

    - 런타임 시 Variant 지정

    - 플랫폼에 따라 맞는 에셋 번들 쉽게 로딩

    - 하드웨어 스펙의 차이에 따라 구분 가능

     


     

    ⚠️ 셰이더를 번들에 포함 시킬 때(주의사항) ⚠️

     

    1. 현재 화면과 라이트매핑 설정을 보고 어느 라이트맵 모드를 사용할지 결정

    (이 말은 즉슨, 사용할 씬을 열어놓고 포함시켜야한다는 뜻)

    2. 수동으로도 설정 가능 (프로젝트 세팅 => 그래픽스 => 셰이더 스트리핑)

     


     

    ⚙️ 빌드 옵션 ⚙️

     

    BuildAssetBundleOptions.DeterministicAssetBundle

     저장된 객체 ID의 해쉬를 이용하여 번들 빌드

     

    👉 로드가 느리다는 단점

    👉 객체가 많으면 충돌 가능성이 높다

    👉 해시 값 보존 (리빌드 시 해시의 변경을 막음 + 해쉬가 중복되면 다운로드X)

     


     

    에셋 번들 압축

     

    유니티는 기본적으로 LZMA로 에셋을 생성하고 LZ4로 캐싱함

     

    1. LZMA 포맷

     

    모든 에셋을 하나로 묶어서 압축

    => 가장 높은 압축 비율 (다운로드 크기를 최대로 줄여줌)

    => 대신 압축해제가 느려서 로드에 시간이 오래 걸림 (순차 읽기만 지원)

     

     

    2. LZ4 포맷(권장)

     

    원본 데이터가 같은 크기의 청크로 분할되고 청크는 독립적으로 압축됨

    => chunk-based 알고리즘 사용

    => 압축률이 낮지만 로딩 효율이 좋음

    => 실시간 압축해제를 원한다면 무작위 읽기 부하가 작은 이 방식 사용

     

     

    3. 비압축

     

    크기는 크지만 다운로드 된 후 접근이 제일 빠름

    (LZMA와 반대의 장단점을 가짐)

     


     

    에셋 번들 내부 구조

     

     

    두가지가 약간 다른 데이터 파일로 배치

     

    일반 번들

    Unity Document - 에셋 번들 내부 구조 사진

     

    씬 번들

    Unity Document - 에셋 번들 내부 구조 사진

     

     


     

    에셋 번들 로드 및 언로드

     

     

    🔄 로드 🔄

     

    AssetBundle.LoadAsset(이름 식별자)

     

    👉 프로젝트 뷰에 표시되는 이름

    👉 원할 경우에는 타입을 인수로 특정 타입만 로드 가능

     

     

    AssetBundle.LoadAssetAsync (비동기식)

     

    👉 위와 같은 동작

    👉 로드 중 메인 스레드 차단 X

    👉 큰 에셋을 로드하거나 여러 에셋 동시에 로드할 때 애플리케이션이 일시중지되지 않음

     

     

    AssteBundle.LoadAllAssets

     

    👉 번들에 포함된 모든 오브젝트가 로드

    👉 원할 경우 타입별로 필터링 가능

     

     

    🔄 언로드 🔄 

     

    AssetBundle.Unload(bool isAll)

     

    👉 모든 데이터 언로드할지 아니면 다운로드된 번들에서 압축된 데이터만 언로드할지 불린 파라미터 사용

    👉 true로 설정하면 모든 것을 언로드하게 되고 로드된 에셋들이 제거됨

     


     

    에셋 번들을 위한 에셋 준비 (전략)

     

     

    논리적 엔티티 그룹화

     

    - 기능적인 부분에 따라 번들 할당

    - DLC에 적합

    - 엔티티 하나만 변경하고 변경되지 않은 추가 에셋은 다운로드하지 않는 장점

    - 이 전략에 가장 중요한 부분은 개발자가 이 에셋이 어디에 쓰이는지 다 파악해야 한다는 점

     

     

    타입 그룹화

     

    - 오디오 트랙이나 언어 파일과 같은, 타입이 비슷한 에셋하나의 에셋 번들에 할당

    - ex) windows와 mac의 오디오 압축 설정이 동일한 경우 재사용 가능

    - 셰이더 같은 경우 특정 플랫폼에만 해당되는 옵션과 함께 컴파일되는 경향이 있음

    => 그럴 때 mac용 셰이더 번들을 windows에서는 재사용하지 못하게 됨

     

     

    동시 콘텐츠 그룹화

     

    - 동시에 로드되고 사용될 에셋을 하나로 묶기

    - 동시 콘텐츠 그룹화 번들에 에셋 하나에 종속성이 있으면 로드 시간이 크게 증가

     


     

    추가 팁 ✨

     

    - 자주 업데이트되는 오브젝트는 변경 빈도가 낮은 오브젝트와 나누어라

    - 동시에 로드될 가능성이 큰 오브젝트끼리 그룹화하

    - 오브젝트 그룹이 단순히 같은 오브젝트에 다른 버전이라면 배리언트를 고려하

     


     

    에셋 번들 종속성

     

    - 여러 에셋 번들에서 사용되는 에셋 => 공통 에셋

    - 공통 에셋은 메모리 리소스와 로딩 시간에 영향

     

    에디터 설정

    - 공통 에셋을 자체 에셋 번들에 할당

     

    런타임 로딩

    - 로드되는 순서

     

    Unity Document 에셋번들 - 에셋 번들 종속성

    프리팹이 로드되었지만 Material이 로드되지 않은 경우

     


     

    문제 해결

     

     

    에셋 중복

     

    두 개의 서로 다른 오브젝트가 서로 다른 에셋 번들일 때,

    서로 공통 종속성 오브젝트에 대한 레퍼런스가 있는 경우 두 에셋 번들에 모두 복사되는 현상

     

     

    해결 방법

     

    - 종속성 공유하지 않게 하기

    - 종속성을 공유하는 두 에셋 번들을 동시에 로드되지 않게 분할

    - 모든 종속성 에셋이 자체적인 에셋 번들에 내장되도록 함

    => 종속성 추적해야하고 로드 호출 전에 올바른 에셋 번들이 로드되는지 확인 필요 (복잡성 발생)

     

     


     

    그 외

     

    에셋 번들을 알아보던 과정 중에 "어드레서블" 이라는 것을 보게 되었다.

    간단히 어드레서블이란 에셋 번들 + 관리 시스템으로 에셋 번들과의 차이점은 저장소로부터 에셋을 가져오는 방식이 다르다는 것이다.

    더 자세한 내용은 나중에 다시 알아봐야겠다.

     


     

    참고 자료 모음

     

    Unity Document 자료

    https://docs.unity3d.com/kr/530/Manual/AssetBundlesIntro.html

    https://docs.unity3d.com/kr/2021.3/Manual/AssetBundles-Preparing.html

    728x90

    '엔진(Unity, Unreal)' 카테고리의 다른 글

    Application.isEditor와 #if UNITY_EDITOR  (0) 2023.11.21
    Plastic SCM  (1) 2023.10.11
    유니티 Not allowed 버그 (Mesh)  (0) 2023.04.06
    [1] Unreal 기초 이론 다지기 (Unity와 비교)  (0) 2023.01.21

    댓글