Version: Unity 6.0 (6000.0)
언어 : 한국어
Use AssetBundles to load assets at runtime
Creating AssetBundles

에셋 번들

에셋 번들 은 Unity가 런타임 시 로드할 수 있는 플랫폼별 비코드 에셋(예: 모델, 텍스처, 프리팹, 오디오 클립, 전체 씬 등)을 포함하는 아카이브 파일입니다. 에셋 번들은 서로의 종속성을 표현할 수 있습니다. 예를 들어 한 에셋 번들의 머티리얼은 다른 에셋 번들의 텍스처를 참조할 수 있습니다. 네트워크를 통한 효율적인 전송을 위해 사용 사례 요구 사항에 따라 빌트인 알고리즘을 선택하여 에셋 번들을 압축할 수 있습니다(LZMA, LZ4).

에셋 번들은 DLC(다운로드 가능 콘텐츠)에 유용합니다. 초기 설치 크기를 줄이고, 최종 사용자 플랫폼용으로 에셋 로딩이 최적화되고, 런타임 메모리의 압박이 줄어듭니다.

스탠드얼론 플랫폼용으로 빌드된 에셋 번들은 해당 플랫폼에서만 로드할 수 있습니다. 예를 들어 iOS에 빌드된 번들은 Android와 호환되지 않습니다. 그 이유 중 하나는 셰이더, 텍스처, 기타 데이터 유형이 BuildTarget에 따라 플랫폼별 포맷에 빌드되기 때문입니다.

에셋 번들을 빌드하거나 다시 빌드할 때는 일반적으로 단일 API 호출을 사용하여 프로젝트의 모든 에셋 번들을 함께 빌드합니다. 일반적으로는 개별적으로 빌드하거나 다시 빌드하지 않는 것이 좋습니다. 함께 빌드할 때 Unity 에디터는 각 에셋 번들에 콘텐츠를 참조하거나 임베드하는 방식을 결정하는데 이는 다른 에셋 번들에 포함된 내용에 따라 달라질 수 있기 때문입니다. 프로젝트의 에셋 번들 간 레퍼런스와 종속성을 이해하는 고급 사용자라면 예외입니다. 이때 프로젝트의 에셋 번들의 하위 세트만 빌드할 수 있는 경우도 있습니다.

에셋 번들에 포함되어 있는 것

에셋 번들을 로드하는 데 사용하는 API는 간단하게 설계되었기 때문에 에셋 번들 내에서 데이터가 표현되는 세부 정보를 추상화합니다. 그러나 특히 툴을 사용하여 에셋 번들의 콘텐츠를 추출하거나 검사하는 경우 구조를 이해하는 것이 유용할 수 있습니다.

에셋 번들은 압축 파일과 유사한 컨테이너 파일 포맷입니다. 바이너리 포맷 헤더가 있으며 그 안에 추가 파일이 내장되어 있습니다. 이러한 추가 파일은 다음의 두 가지 유형으로 구성됩니다.

  • 직렬화된 Unity 오브젝트가 포함된 직렬화된 파일. 플레이어 빌드에서 사용되는 것과 동일한 바이너리 파일 포맷입니다. 에셋이 포함된 에셋 번들의 경우 모든 오브젝트는 단일 직렬화된 파일에 작성됩니다. 씬이 포함된 에셋 번들의 경우 씬마다 두 개의 직렬화된 파일이 있습니다. 하나는 씬 계층 구조의 오브젝트를 포함하고 다른 하나는 참조된 오브젝트를 포함합니다.
  • 리소스 파일은 특정 에셋(텍스처 및 오디오)에 별도로 저장되는 바이너리 데이터 청크입니다. 이 구분을 통해 Unity는 멀티 스레드 코드를 사용하여 디스크에서 효율적으로 로드할 수 있습니다.

에셋 번들 파일에는 항상 직렬화된 에셋 번들 오브젝트가 포함됩니다. 이 오브젝트는 에셋 번들의 콘텐츠를 위한 디렉토리 역할을 합니다. 특정 에셋 번들 아카이브에서 에셋을 로드하기 위해 코드를 통해 상호 작용하는 오브젝트이며, Addressables API를 사용하여 에셋 번들에서 에셋을 로드할 때도 내부적으로 사용됩니다.

이전 버전과의 호환성

에셋 번들을 빌드할 때 포함된 오브젝트는 빌드하는 데 사용한 Unity 에디터 버전의 정의와 빌드된 프로젝트에 정의된 C# 유형을 사용하여 직렬화됩니다. 각 유형의 정보는 에셋 번들 내부에 _타입 트리_라는 구조에 기록됩니다. 이러한 유형 정보는 에셋 번들의 크기에 어느 정도 영향을 미치지만, 빌드 시 플레이어의 버전이 에디터 버전과 일치하지 않을 때 해당 오브젝트를 로드할 수 있도록 하는 데 중요합니다. 많은 Unity 기능의 유형은 매우 안정적이며 버전 간에 약간만 변경되므로 이전 버전과의 호환성 지원이 잘 이루어집니다. 하지만 Unity 기능이 크게 변경되는 경우 이전 데이터를 신규 버전에서 예상한 결과를 얻을 수 있는 방식으로 로드하지 못할 수 있습니다. 이 경우 새 버전의 Unity를 사용하여 에셋 번들을 다시 빌드해야 합니다.

Unity는 이후 버전과의 호환성을 지원하지 않으므로 새 버전의 Unity로 빌드된 에셋 번들을 이전 버전의 Unity로 빌드된 플레이어에 로드하면 콘텐츠를 로드하는 데 문제가 있을 수 있습니다.

참고: 기본적으로 파일을 빌드하는 데 사용된 Unity 에디터 버전이 에셋 번들 헤더에 포함됩니다. 이 정보는 이전 버전과의 호환성 문제를 조사할 때 유용할 수 있습니다. 하지만 에셋 번들이 불필요하게 다시 빌드되고, 에디터를 약간 업그레이드한 후 프로젝트가 다시 빌드된 경우 불필요한 클라이언트 다운로드가 발생할 수도 있습니다. 이 문제를 방지하려면 에디터 버전을 제외하면 됩니다. BuildAssetBundleOptions.AssetBundleStripUnityVersion을 참조하십시오.

스크립트 오브젝트 지원

에셋 번들은 어셈블리를 포함하지 않으며 새로운 C# 클래스나 기존 클래스의 변경 사항을 배포하는 데 사용되지 않습니다. 컴파일된 어셈블리가 포함된 것은 플레이어 빌드입니다. 따라서 코드 변경 사항을 릴리스하려면 게임 또는 앱의 메인 빌드를 다시 빌드하고 재배포해야 합니다.

하지만 에셋 번들을 사용하여 게임의 새로운 아이템과 같이 플레이어 빌드에 컴파일된 클래스의 인스턴스인 새로운 오브젝트를 배포할 수 있습니다.

예를 들어 에셋 번들에는 스크립터블 오브젝트 에셋이 포함될 수 있습니다. 에셋 번들에서 해당 에셋을 로드하면 Unity는 어셈블리 이름, 네임스페이스, 클래스 이름을 기준으로 일치하는 클래스 정의를 찾습니다. 해당 클래스의 인스턴스인 오브젝트를 생성하고 직렬화된 값을 사용하여 오브젝트의 필드를 설정합니다.

오브젝트가 클래스의 이전 정의를 기반으로 직렬화된 경우 Unity는 이전 버전과의 호환성 지원을 통해 타입 트리에 기록된 필드 이름 및 기타 정보를 기준으로 필드를 매칭합니다.

스크립트는 플랫폼별 코드를 지정하기 위해 조건부 컴파일을 사용하는 경우가 많습니다. 예를 들어 UNITY_STANDALONE, UNITY_IOS, UNITY_ANDROID 같은 스크립팅 심볼을 사용합니다. 클래스나 구조체의 필드가 일부 타겟에서 컴파일되지 않으면 에셋 번들 내의 오브젝트 직렬화에는 해당 필드가 포함되지 않으며 타입 트리에 포함되지 않습니다. 이는 타게팅하는 각 플랫폼에 에셋 번들을 다시 빌드해야 하는 또 다른 이유입니다.

에셋 번들 빌드 방법

Unity용 에셋 번들을 빌드하는 데 지원되는 API는 다음과 같이 두 가지가 있습니다.

  • 빌트인 네이티브 API(예: BuildPipeline.BuildAssetBundles, AssetBundle, UnityWebRequestAssetBundle) 사용. 이 기능은 매뉴얼 섹션에 설명되어 있습니다. 하지만 이 방법은 상당히 저수준에 속합니다. 예를 들어 에셋 종속성을 이해하고, 번들 할당을 직접 결정하고, 자체 빌드 스크립트를 작성해야 합니다.
  • Addressables 패키지 사용. 이 옵션은 사용자 친화적이므로 더욱 권장되며, 어드레서블 UI에서 직접 에셋 번들을 정의하고 빌드할 수 있습니다. 이는 동일한 기본 파일 포맷과 동일한 저수준의 Unity 로딩 및 캐싱 서비스를 사용하지만, 고수준의 추상 API를 통해 간접적으로 사용합니다. 따라서 이 섹션에서 설명하는 많은 개념은 어드레서블과 함께 사용되는 에셋 번들에 적용되는데, 실제 사용법에 대한 자세한 내용은 어드레서블 기술 자료를 참조하십시오.
Use AssetBundles to load assets at runtime
Creating AssetBundles