하나 이상의 UnityEngine.Object에 다른 에셋 번들에 있는 UnityEngine.Object에 대한 참조가 포함되어 있으면 에셋 번들이 다른 에셋 번들에 종속될 수 있다. UnityEngine.Object에 에셋 번들에 포함되지 않은 UnityEngine.Object에 대한 참조가 포함되어 있다면 종속성이 발생하지 않는다. 이 경우에는, 에셋 번들을 빌드할 때 번들이 종속되어 있는 오브젝트의 사본이 번들에 복사된다. 여러 번들 내의 여러 오브젝트가 번들에 등록되지 않은 같은 오브젝트를 참조를 포함하면, 해당 오브젝트에 대한 종속성이 있는 모든 번들이 오브젝트의 자체적인 복사본을 만들어 내장된 에셋 번들로 패키지화 한다.
에셋 번들에 종속성이 포함되어 있으면 인스턴스화(instantiate)하려는 오브젝트가 로드되기전에 이러한 종속성을 포함하는 에셋 번들을 로드하는 것이 중요하다. 유니티는 종속된 것을 자동으로 로드하려고 시도하지 않는다.
다음 예제를 고려해 볼때, 에셋 번들 1의 머티리얼은 에셋 번들 2의 텍스처를 참조한다.
이 예제에서는, 번들 1의 머티리얼을 로딩하기 이전에 번들 2를 메모리에 로드해 두어야한다. 하지만 번들 1과 번들 2를 로드하는 순서가 중요한 것이 아니고, 번들 1의 머티리얼이 로드되기 전에 번들 2에서 필요한 자원이 로드되어 있어야한다는 점이 중요하다.
다음 섹션에서는 이전 섹션에서 다룬 AssetBundleManifest 객체를 사용하여 런타임에 종속성을 결정하고 로드하는 방법에 대해서 설명한다.
[유니티 어필리에이트 프로그램]
아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.
필요에 따라 BuildAssetBundleOptions을 자유롭게 조합할 수 있지만, 에셋 번들 압축을 처리하는 세 가지 BuildAssetBundleOptions가 있다.
- BuildAssetBundleOptions.None
- BuildAssetBundleOptions.UncompressedAssetBundle
- BuildAssetBundleOptions.ChunkBasedCompression
BuildAssetBundleOptions.None 이 번들 옵션은 직렬화된 데이터 파일의 단일 압축 LZMA 스트림인 LZMA 포멧 압축을 사용한다. LZMA 압축을 사용하려면 전체 번들이 사용되기 전에 압축이 풀려있어야 한다. 압축 결과 파일의 용량이 가장 작지만 압축 해제로 인한 로딩 시간이 길어진다. 이 옵션을 사용했을 때 번들의 에셋을 사용하려면 초기에 전체 번들의 압축을 풀어두어야 한다.
일단 한번 번들이 압축 해제되면, 번들에서 에셋을 사용하기 전에 전체 번들을 압축 헤제할 필요가 없는 LZ4 압축을 사용해서 디스크에서 재압축된다. 이 옵션은 번들이 하나의 에셋을 사용하기 위해 모든 에셋을 로딩해야하는 에셋이 포함된 경우에 사용하면 가장 적합하다. 캐릭터나 씬의 모든 에셋을 패키징하는 것이 이 옵션을 사용하는 번들의 예시이다.
LZMA 압축을 사용하는 것은 파일 크기가 작아서 오프 사이트 호스트에서 에셋 번들을 처음 다운로드하는 경우에만 권장한다. 파일을 다운로드하면 LZ4 압축 번들로 캐시된다.
BuildAssetBundleOptions.UncompressedAssetBundle 이 옵션은 전혀 압축되지 않은 방식으로 번들을 만든다. 그렇기 때문에 파일의 다운로드 용량이 커진다. 하지만 한번 다운로드한 이후에는 로딩 시간이 훨씬 빨라진다.
BuildAssetBundleOptions.ChunkBasedCompression 는 LZ4로 알려진 압축 방법을 사용하기 때문에 LZMA보다 압축 파일의 용량이 커지지만 LZMA와는 달리 전체 번들의 압축이 해제되지 않아도 사용할 수 있다. LZ4는 에셋 번들을 조각 또는 "청크"로 로드할 수 있는 청크 기반 알고리즘을 사용한다. 단일 청크의 압축을 풀면 에셋 번들의 다른 청크가 압축 해제 되지 않아도 포함된 에셋을 사용할 수 있다.
ChunkBasedCompression을 사용하면 압축되지 않은 번들에 로딩 시간을 비교할 수 있으므로 디스크 크기가 줄어든다.
그러나 빌드 타겟에 대한 하드 코딩을 하지 않으려면 "EditorUserBuildSettings.activeBuildTarget"을 자유롭게 이용하면 된다. 그렇게 하면 현재 설정중인 플랫폼을 자동으로 찾고 해당 타겟을 기반으로 에셋 번들을 빌드할 수 있다.
빌드 스크립트를 올바르게 설정했다면 번들을 빌드해야한다. 위의 스크립트 예제를 따라한 경우에는 Asset >> Asset Bundles Build를 클릭하여 프로세스를 시작하면 된다.
에셋 번들을 성공적으로 빌드했다면 AssetBundles 디렉토리에 예상보다 많은 파일이 있음을 알 수 있다. 설정한 번들의 수보다 2 * (n + 1)개 더 많은 파일이 있을 것인데, BuildPipeline.BuildAssetBundles의 결과물을 정확히 살펴보자.
유니티 에디터에서 지정한 모든 번들에 대해 에셋 번들 이름의 파일과 에셋 번들 이름 + ".manifest" 파일이 있을 것이다.
생성한 모든 에셋 번들과 이름을 공유하지 않는 추가 번들 및 매니페스트가 있다. 이것들은 (에셋 번들이 내장된 경우) 위치하고 잇는 디렉토리의 이름을 따서 이름이 지어진다. 이것이 매니페스트 번들이다. 이것들에 대해서 더 자세히 이야기할 것이다.
에셋 번들 파일
이 파일은 ".manifest" 확장자가 없는 파일이며 실행시에 에셋을 로드하기 위해 불러와야할 파일이다.
에셋 번들 파일은 내부적으로 여러 파일을 포함하는 아카이브이다. 이 아카이브의 구조는 일반 에셋 번들인지 씬 에셋 번들인지에 따라 약간 변경될 수 있다. 이것이 일반 에셋 번들의 구조이다.
씬 에셋 번들은 일반 에셋 번들에서 씬의 스트림 로딩과 컨텐츠에 최적화되도록 변경된 콘텐츠이다. 아래 이미지는 씬 에셋 번들의 내부 구조를 보여준다.
매니페스트 파일
추가 매니페스트 번들을 포함하여 생성된 모든 번들에 대해 연관된 매니페스트 파일이 생성된다. 매니페스트 파일은 텍스트 편집기로 열 수 잇으며 CRC(Cyclic Redundancy Check) 데이터 및 번들에 대한 종속성 데이터와 같은 정보를 포함한다. 일반 에셋 번들의 매니페스트 파일은 다음과 같은 내용이다 :
여기에는 에셋 번들의 관계 및 종속성에 대한 정보가 표시된다. 지금 당장은 이 번들에 AssetBundleManifest 객체가 들어있다고만 이해하면 된다. 이 객체는 런타임에 불러올 번들의 종속성을 파악하는데 매우 유용하다. 이 번들과 매니페스트 객체를 사용하는 법은 섹션 6에서 확인할 수 있다.
[유니티 어필리에이트 프로그램]
아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.