Version: Unity 6.0 (6000.0)
언어 : 한국어
에셋 번들의 전문적인 활용
AssetBundle platform considerations

에셋 번들 종속성

하나 이상의 UnityEngine.Objects에 다른 번들의 UnityEngine.Object에 대한 레퍼런스가 포함된 경우 에셋 번들은 다른 에셋 번들에 종속될 수 있습니다. 에셋 번들에 포함되지 않은 UnityEngine.Object에 대한 레퍼런스가 UnityEngine.Object에 포함되어 있으면 종속성이 발생하지 않습니다. 이 경우 에셋 번들을 빌드할 때 번들이 종속될 오브젝트의 사본이 번들로 복사됩니다. 번들에 할당되지 않은 동일한 오브젝트에 대한 레퍼런스가 여러 번들에 있는 여러 오브젝트에 포함되어 있으면, 해당 오브젝트에 종속성이 있는 모든 번들은 오브젝트의 자체 복사본을 만들고 빌드된 에셋 번들에 패키징합니다.

에셋 번들이 종속성을 포함하는 경우, 인스턴스화하는 오브젝트가 로드되기 이전에 종속성을 가지는 번들이 로드되도록 해야 합니다. Unity는 종속성을 자동으로 로드하지 않습니다.

예제를 하나 들어 보겠습니다. 번들 1 에 있는 머티리얼이 번들 2 에 있는 텍스처를 참조한다고 가정하겠습니다.

이 예시에서는 번들 1 에서 머티리얼을 로드하기 전에 번들 2 를 메모리에 로드해야 합니다. 어떤 순서로 번들 1번들 2 를 로드하든 상관없이 중요한 점은 번들 1 에서 머티리얼을 로드하기 전에 번들 2 를 로드하는 것입니다. 에셋 번들의 전문적인 활용 섹션에서는 빌드에서 생성된 AssetBundleManifest 오브젝트를 사용하여 런타임 시 종속성을 확인하고 로드하는 방법에 대해 설명합니다.

에셋 번들 간의 중복 정보

기본적으로 Unity는 에셋 번들 간의 중복 정보를 최적화하지 않습니다. 즉, 프로젝트의 여러 에셋 번들에 동일한 정보(예: 여러 프리팹에서 사용하는 머티리얼)가 포함될 수 있습니다. 여러 에셋 번들에서 사용되는 에셋을 공통 에셋이라고 합니다. 이는 메모리 리소스와 로드 시간에 영향을 미칠 수 있습니다.

이 페이지에서는 Unity가 에셋 번들 간의 중복 정보를 관리하는 방법과 최적화를 적용하는 방법에 대해 설명합니다.

###에디터 설정

기본적으로 Unity는 중복 정보를 저장하는 데 필요한 메모리를 줄이거나 최소화하는 최적화를 수행하지 않습니다. 빌드 생성 도중 Unity는 에셋 번들 내에서 암시적으로 참조된 에셋의 복제본을 만듭니다. 이러한 중복을 방지하려면 머티리얼과 같은 공통 에셋을 자체 에셋 번들에 할당합니다.

예를 들어 두 개의 프리팹이 있는 애플리케이션이 있을 수 있으며, 두 프리팹 모두 자체 에셋 번들에 할당됩니다. 두 프리팹 모두 에셋 번들에 할당되지 않은 동일한 머티리얼을 공유합니다. 이 머티리얼은 에셋 번들에 할당되지 않은 텍스처를 참조합니다.

에셋 번들 워크플로를 따르고 예제 클래스 CreateAssetBundles를 사용하여 에셋 번들을 만드는 경우 생성된 각 에셋 번들에는 머티리얼(셰이더 및 참조된 텍스처 포함)이 포함됩니다. 아래의 예시 이미지에서 프리팹 파일의 크기는 각각 383KB와 377KB입니다.

프로젝트에 프리팹이 더 많으면 이 동작은 최종 설치 프로그램 크기와 두 에셋 번들이 로드될 때의 런타임 메모리 사용량에 영향을 미칩니다. 에셋 번들 간 데이터 중복은 배칭에도 영향을 미칩니다. Unity는 동일한 머티리얼의 각 복사본을 고유한 머티리얼로 간주하기 때문입니다.

데이터 중복을 방지하려면 머티리얼과 참조된 에셋을 자체 modulesmaterials 에셋 번들에 할당합니다. 텍스처 종속성도 빌드 프로세스 중에 에셋 번들에 자동으로 포함되므로 머티리얼에만 태그를 지정할 수도 있습니다.

에셋 번들을 다시 만드는 경우 생성된 출력에는 머티리얼과 연결된 텍스처를 포함하는 별도의 modulesmaterials 에셋 번들(359KB)이 포함됩니다. 이렇게 하면 프리팹의 다른 에셋 번들 크기가 크게 줄어듭니다(이전 반복 작업의 약 380KB에서 약 20KB로 감소함).

아래 이미지에서 이와 관련된 내용을 확인할 수 있습니다.

###런타임 로딩

일반 에셋을 단일 에셋 번들로 추출할 때는 종속성에 주의해야 합니다. 특히 프리팹을 사용하여 모듈을 인스턴스화하는 경우 머티리얼이 로드되지 않습니다.

로드된 머티리얼이 없는 프리팹
로드된 머티리얼이 없는 프리팹

이 문제를 해결하려면 모듈에 속한 에셋 번들을 로드하기 전에 머티리얼 에셋 번들을 메모리에 로드하십시오. 이는 다음 예제의 materialsAB 변수에서 발생합니다.

using System.IO;
using UnityEngine;

public class InstantiateAssetBundles : MonoBehaviour
{
    void Start()
    {
        var materialsAB = AssetBundle.LoadFromFile(Path.Combine(Application.dataPath, Path.Combine("AssetBundles", "modulesmaterials")));
        var moduleAB = AssetBundle.LoadFromFile(Path.Combine(Application.dataPath, Path.Combine("AssetBundles", "example-prefab")));

        if (materialsAB == null || moduleAB == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            return;
        }
        var prefab = moduleAB.LoadAsset<GameObject>("example-prefab");
        Instantiate(prefab);
    }
}

올바르게 로드된 머티리얼이 있는 프리팹
올바르게 로드된 머티리얼이 있는 프리팹

참고: LZ4 압축 및 압축되지 않은 에셋 번들을 사용할 때, AssetBundle.LoadFromFile은 메모리에 해당 콘텐츠의 카탈로그만 로드하지만, 콘텐츠 자체는 로드하지 않습니다. 이 문제가 발생하는지 확인하려면 Memory Profiler 패키지를 사용하여 메모리 사용량을 검사합니다.

에셋 번들의 전문적인 활용
AssetBundle platform considerations