에셋 번들 은 플랫폼별 비코드 에셋(예: 모델, 텍스처, 프리팹, 오디오 클립, 씬 전체)이 들어 있는 아카이브 파일이며 런타임 시점에 로드할 수 있습니다. 에셋 번들에는 서로 종속성을 표시할 수 있습니다. 예를 들어 한 에셋 번들의 머티리얼이 다른 에셋 번들의 텍스처를 참조할 수 있습니다. 효율적인 네트워크 전송을 위해 에셋 번들은 사용 요구 사항(LZMA 및 LZ4)에 따라 빌트인 알고리즘을 사용하여 압축할 수 있습니다.
에셋 번들은 다운로드 가능 콘텐츠(DLC)에 유용합니다. 초기 설치 크기를 줄이고, 최종 사용자 플랫폼용으로 에셋 로딩이 최적화되고, 런타임 메모리의 압박이 줄어듭니다.
스탠드얼론 플랫폼용으로 빌드된 에셋 번들은 해당 플랫폼에서만 로드할 수 있습니다. 예를 들어, iOS에서 빌드된 번들은 Android와 호환되지 않습니다. 그 이유 중 하나는 셰이더, 텍스처 및 기타 데이터 유형이 BuildTarget을 기반으로 플랫폼별 포맷으로 빌드되기 때문입니다.
에셋 번들을 빌드하거나 다시 빌드할 때는 일반적으로 단일 API 호출을 사용하여 프로젝트의 모든 에셋 번들을 함께 빌드합니다. 일반적으로는 개별적으로 빌드하거나 다시 빌드하지 않는 것이 가장 좋습니다. 함께 빌드할 경우 Unity 에디터는 다른 에셋 번들에 포함된 콘텐츠에 따라 각 에셋 번들의 콘텐츠를 참조하거나 임베드하는 방법을 결정하기 때문입니다. 예외적으로 프로젝트 내 에셋 번들 간의 레퍼런스와 종속성을 이해하는 숙련된 사용자의 경우 프로젝트의 에셋 번들 중 하위 세트만 빌드할 수 있습니다.
에셋 번들을 로드하는 데 사용하는 API는 단순하게 설계되었기 때문에, 에셋 번들 내부에서 데이터가 표시되는 방식에 대한 세부 사항은 추상화되어 있습니다. 그러나 특히 에셋 번들의 콘텐츠를 추출하거나 검사하는 툴을 사용하는 경우 구조를 이해하는 것이 유용할 수 있습니다.
에셋 번들은 zip 파일과 유사한 컨테이너 파일 포맷입니다. 바이너리 포맷의 헤더가 있고 그 안에 추가 파일이 포함되어 있습니다. 이러한 추가 파일은 두 가지 유형으로 구성됩니다.
에셋 번들 파일에는 항상 직렬화된 에셋 번들 오브젝트가 포함됩니다. 이 오브젝트는 에셋 번들 콘텐츠의 디렉토리처럼 작동합니다. 특정 에셋 번들 아카이브에서 에셋을 로드하기 위해 코드를 통해 상호작용하는 오브젝트이며, 어드레서블 API를 사용하여 에셋 번들에서 에셋을 로드할 때 내부적으로도 사용됩니다.
에셋 번들을 빌드할 때 포함된 오브젝트는 빌드에 사용한 Unity 에디터 버전의 정의와 빌드된 프로젝트에 정의된 C# 유형을 사용하여 직렬화됩니다. 각 유형에 대한 정보는 타입 트리 라는 구조로 에셋 번들 내부에 기록됩니다. 이 유형 정보는 에셋 번들의 크기에 어느 정도 영향을 미치지만, 빌드 시 플레이어 버전이 에디터 버전과 일치하지 않을 때 해당 오브젝트를 로드할 수 있도록 하는 데 매우 중요합니다. 많은 Unity 기능의 경우 유형이 매우 안정적이며 버전 간에 약간의 변경만 이루어지므로 이전 버전과의 호환성이 잘 지원됩니다. 그러나 Unity 기능이 상당 부분 변경되는 경우 최신 버전에서 예상되는 결과를 얻을 수 있는 방식으로 이전 데이터를 로드하지는 못할 수 있습니다. 이 경우 새 버전의 Unity를 사용하여 에셋 번들을 다시 빌드해야 합니다.
Unity는 향후 버전과의 호환성을 지원하지 않으므로, 새로운 버전의 Unity로 빌드한 에셋 번들을 이전 버전의 Unity로 빌드한 플레이어에 로드하면 콘텐츠를 로드하는 데 문제가 발생할 수 있습니다.
참고: 기본적으로 파일을 빌드하는 데 사용된 Unity 에디터 버전이 에셋 번들 헤더에 포함됩니다. 이 정보는 이전 버전과의 호환성 문제를 조사할 때 유용할 수 있습니다. 하지만 사소한 수준의 에디터 업그레이드 후 프로젝트를 다시 빌드하는 경우 에셋 번들이 불필요하게 다시 빌드되고 불필요한 클라이언트 다운로드가 발생할 수 있습니다. 이를 방지하려면 에디터 버전을 제외할 수 있습니다. BuildAssetBundleOptions.AssetBundleStripUnityVersion을 참조하십시오.
에셋 번들은 어셈블리를 포함하지 않으며 새 C# 클래스나 기존 클래스에 대한 변경 사항을 배포하는 데 사용되지 않습니다. 오히려 컴파일된 어셈블리를 포함하는 것은 플레이어 빌드입니다. 따라서 코드 변경 사항을 릴리스하려면 게임 또는 앱의 메인 빌드를 다시 빌드하고 다시 배포해야 합니다.
그러나 에셋 번들을 사용하여 플레이어 빌드에 컴파일된 클래스의 인스턴스인 새 오브젝트(예: 게임의 새 아이템)를 배포할 수 있습니다.
예를 들어, 에셋 번들에는 스크립터블 오브젝트 에셋이 포함될 수 있습니다. 에셋 번들에서 해당 에셋을 로드하면 Unity는 어셈블리 이름, 네임스페이스, 클래스 이름을 기준으로 일치하는 클래스 정의를 찾습니다. 해당 클래스의 인스턴스인 오브젝트를 생성하고 직렬화된 값을 사용하여 오브젝트의 필드를 설정합니다.
오브젝트가 클래스의 이전 정의를 기반으로 직렬화된 경우, Unity는 이전 버전과의 호환성 지원을 사용하여 타입 트리에 기록된 필드 이름과 기타 정보를 기반으로 가능한 모든 필드를 일치시킵니다.
스크립트에서는 조건부 컴파일을 사용하여 플랫폼별 코드를 지정하는 경우가 많습니다. 예를 들어 UNITY_STANDALONE, UNITY_IOS, UNITY_ANDROID와 같은 스크립팅 기호를 사용합니다. 클래스 또는 구조체의 필드가 일부 타겟에서 컴파일되지 않는 경우 에셋 번들 내부의 오브젝트 직렬화에는 해당 필드가 포함되지 않으며, 타입 트리에도 포함되지 않습니다. 그렇기 때문에 타게팅하는 각 플랫폼에 대해 에셋 번들을 다시 빌드해야 합니다.
Unity용 에셋 번들을 빌드하는 데 지원되는 API는 두 가지입니다.
BuildPipeline.BuildAssetBundles
, AssetBundle
및 UnityWebRequestAssetBundle
). 이것이 매뉴얼의 이 섹션에서 설명하는 기능입니다. 하지만 이 방법은 꽤 낮은 레벨에 해당하며, 예를 들면 에셋 종속성을 이해하고, 번들 할당을 직접 결정하고, 빌드 스크립트를 직접 작성하는 등의 작업을 필요로 합니다.