Version: 2022.3
언어: 한국어
에셋 번들로 패치
Unity 에셋 번들 브라우저 툴

문제 해결

이어지는 섹션에서는 에셋 번들을 사용하는 프로젝트에서 흔히 발생하는 몇 가지 문제에 대해 설명합니다.

에셋(Asset) 중복

Unity’s AssetBundle system will discover all dependencies of an Object when the Object is built into an AssetBundle. This is done using the Asset Database. This dependency information is used to determine the set of Objects that will be included in an AssetBundle.

Assignment to AssetBundles happens at the Asset level. The Objects inside an Asset that is explicitly assigned to an AssetBundle will only be built into that single AssetBundle. Depending which signature of BuildPipeline.BuildAssetBundles is called, an Asset is “explicitly assigned” either by setting the Asset’s AssetImporter.assetBundleName property to a non-empty string, or by listing it in AssetBundleBuild.assetNames.

Any Object that is part of an Asset that is not explicitly assigned in an AssetBundle will be included in each AssetBundle that contains any Objects that reference it.

In other words, if two different Objects are assigned to two different AssetBundles, but both have references to a common dependency Object, then that dependency Object will be copied into both AssetBundles. The duplicated dependency will also be instanced, meaning that the two copies of the dependency Object will be considered different Objects with a different identifiers. This will increase the total size of the application’s AssetBundles. This will also cause two different copies of the Object to be loaded into memory if the application loads both of its parents.

이 문제는 아래의 몇 가지 방법으로 해결할 수 있습니다.

  1. 서로 다른 에셋 번들에 내장된 오브젝트가 종속성을 공유하지 않도록 합니다. 종속성을 공유하는 오브젝트는 종속성 중복 없이 동일한 에셋 번들에 포함시킬 수 있습니다.

    • 공유되는 종속성이 많은 프로젝트에는 이 메서드가 일반적으로 실용적이지 않습니다. 이 경우 항상 다시 빌드해야 하므로 불편하고 매번 다운로드해야 하는 비효율적인 단일 에셋 번들이 생길 수 있기 때문입니다.
  2. 종속성을 공유하는 두 에셋 번들이 동시에 로드되지 않도록 에셋 번들을 분할합니다.

    • This method may work for certain types of projects, such as level-based games. However there is still a trade-off, because duplicated objects will increase the build time and sizes of the project’s AssetBundles, and could impact loading times.
  3. 모든 종속성 에셋이 자체적인 에셋 번들에 내장되도록 합니다. 그러면 에셋이 중복될 위험이 완전히 배제되지만, 애플리케이션이 에셋 번들 간 종속성을 추적해야 하고 AssetBundle.LoadAsset API를 호출하기 전에 올바른 에셋 번들이 로드되는지 확인해야 하는 복잡성이 발생합니다.

Object dependencies are tracked via the AssetDatabase API, located in the UnityEditor namespace. As the namespace implies, this API is only available in the Unity Editor and not at runtime. AssetDatabase.GetDependencies can be used to locate all of the immediate dependencies of a specific Object or Asset. Note that these dependencies may have their own dependencies so this can be a recursive calculation. The assignment of Assets to AssetBundles will either be defined explicitly by passing arrays of AssetBundleBuild structures when calling BuildPipeline.BuildAssetBundles, or can be queried using the AssetImporter API. It is possible to write an Editor script that ensures that all of an AssetBundle’s direct or indirect dependencies are assigned to AssetBundles, or that no two AssetBundles share dependencies that have not been assigned to an AssetBundle.

Note: When building AssetBundles with the Addressables package, the Addressables Analyze window can be used to discover duplicated assets.

스프라이트 아틀라스(Sprite Atlas) 중복

The following sections describe a quirk of asset dependency calculation code when used in conjunction with automatically-generated sprite atlases.

자동 생성 스프라이트 아틀라스는 스프라이트 아틀라스가 생성된 스프라이트 오브젝트가 포함된 에셋 번들에 할당됩니다. 스프라이트 오브젝트가 여러 에셋 번들에 할당된 경우, 스프라이트 아틀라스가 에셋 번들에 할당되지 않고 중복됩니다. 스프라이트 오브젝트가 에셋 번들에 할당되지 않은 경우, 스트라이트 아틀라스도 에셋 번들에 할당되지 않습니다.

스프라이트 아틀라스가 중복되지 않도록 하려면 모든 동일한 스프라이트 아틀라이스 안에 태그된 스프라이트가 동일한 에셋 번들에 할당되는지 확인합니다.

Android 텍스처(Textures)

Android 에코시스템에는 매우 다양한 디바이스가 있기 때문에 종종 텍스처를 몇 가지 다른 포맷으로 압축해야 할 필요가 있습니다. 모든 Android 디바이스는 ETC1을 지원하지만, ETC1은 알파 채널이 있는 텍스처를 지원하지 않습니다. 애플리케이션에서 OpenGL ES 2 지원이 필요하지 않은 경우, 모든 OpenGL ES 3 디바이스에서 지원되는 ETC2를 사용하면 문제를 가장 간단하게 해결할 수 있습니다.

Most applications need to ship on older devices where ETC2 support is unavailable. One way to solve this problem is with AssetBundle Variants. (Please see Unity’s Android optimization guide for details on other options.)

에셋 번들 배리언트를 사용하려면 ETC1을 사용하여 완전히 압축할 수 없는 모든 텍스처를 텍스처 전용 에셋 번들에 분리해야 합니다. 그런 다음 DXT5, PVRTC 및 ATITC 같은 제조사별 텍스처 압축 포맷을 사용해 Android 에코시스템의 ETC2 사용 불가 부분을 지원하는 해당 에셋 번들의 배리언트를 충분히 만드십시오. 각 에셋 번들 배리언트에 대해, 포함된 텍스처의 TextureImporter 설정을 배리언트에 해당되는 압축 포맷으로 변경합니다.

런타임 시 다양한 텍스처 압축 포맷 지원 여부를 SystemInfo.SupportsTextureFormat API를 사용하여 인식할 수 있습니다. 이 정보를 사용해 지원되는 포맷으로 압축된 텍스터가 포함되어 있는 에셋 번들 배리언트를 선택하고 로드해야 합니다.

Android 텍스처 압축 포맷에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

Interactions between Shaders and AssetBundles

When you build an AssetBundle, Unity uses information in that bundle to select which shader variants to compile. This includes information about the scenes, materials, Graphics Settings, and ShaderVariantCollections in the AssetBundle.

Separate build pipelines compile their own shaders independently of other pipelines. If both a Player build and an Addressables build reference a shader, Unity compiles two separate copies of the shader, one for each pipeline.

This process doesn’t account for any runtime information such as keywords, textures, or changes due to code execution. If you want to include specific shaders in your build, either include a ShaderVariantCollection with the desired shaders, or include the shader in your build manually by adding it to the Always Included Shaders list in your graphics settings.


에셋 번들로 패치
Unity 에셋 번들 브라우저 툴
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961