Version: 5.3
AssetBundles
에셋 번들 압축(Asset Bundle Compression)

에셋 번들 빌드(Building AssetBundles)

에셋 번들(Unity 에디터와 스크립트에서 AssetBundle__로 불림)을 만들기 위해서는 먼저 프로젝트 폴더에서 번들에 포함할 에셋을 선택해야 합니다. 그 에셋을 위한 인스펙터 창의 맨 아래쪽에 AssetBundle__ 메뉴가 있습니다. 메뉴를 클릭하면 현재 정의된 에셋 번들의 이름이 표시되며 새 번들을 정의하기 위한 옵션 역시 나타납니다.

에셋 번들 생성
에셋 번들 생성

번들을 아직 정의하지 않았다면 New… 버튼을 클릭하고 번들의 이름을 입력해야 합니다.

그런 다음, 이 번들에 에셋을 추가하기 위해 인스펙터 창의 아래에 있는 메뉴를 사용하여 프로젝트 창 내의 에셋을 선택하고 이름을 붙인 번들로 지정합니다.

에셋을 위한 에셋 번들 옵션은 기본적으로 __None__으로 설정되어 있습니다. 그 뜻은 에셋이 에셋 번들로 작성된다는 것이 아니라 메인 프로젝트에 함께 패키지된다는 뜻입니다. 이 메뉴를 사용하여 하나 이상의 에셋 번들을 만들고 이름을 정한 뒤 이 새로운 에셋 번들 이름을 에셋의 목적지로 지정할 수 있습니다.

에셋 번들 생성
에셋 번들 생성

이 예제에서 environment/desert 이라는 에셋 번들에 에셋이 추가되었습니다. 이 에셋 번들은 이전에 추가된 다른 에셋을 포함하고 있을 수 있습니다. 에셋 번들 이름은 항상 소문자로 표시됩니다. 대문자를 사용하면 소문자로 자동 변환됩니다. 에셋 번들 이름에 슬래시를 사용하면 더 효과적으로 폴더를 생성할 수 있으며 위의 스크린 샷이 보여주듯 메뉴상에 하위 메뉴가 생기게 됩니다.

에셋이 할당되지 않은 에셋 번들을 만든다면 Remove Unused Names 옵션을 사용할 수 있습니다. 이 옵션을 사용하면 비어있는 에셋 번들을 삭제합니다.

에셋에 포함된 메타 파일에는 선택한 에셋 번들 이름이 새겨집니다.

에셋 번들 익스포트(Exporting AssetBundles)

에셋 번들은 스크립트 코드를 사용하여 에디터로부터 익스포트 됩니다. 다음은 에셋 번들을 익스포트시키는 스크립트입니다.

using UnityEditor;

public class CreateAssetBundles
{
    [MenuItem ("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles ()
    {
        BuildPipeline.BuildAssetBundles ("Assets/AssetBundles", BuildAssetBundleOptions.None, BuildTarget.StandaloneOSXUniversal);
    }
}

스크립트는 Asset 메뉴 아래에 메뉴 아이템을 생성합니다. 함수를 호출하고 에셋 번들을 만들기 위해서 메뉴 아이템을 선택할 때 진행 표시줄이 있는 빌드 다이얼로그가 나타납니다. BuildPipeline.BuildAssetBundles 함수는 이름이 정해진 에셋 번들을 생성하며 “AssetBundle”이라는 이름의 출력 폴더에 저장됩니다(스크립트 실행 전에 프로젝트 폴더에 “AssetBundle” 폴더를 미리 만들어야 합니다).

익스포트된 각 에셋 번들은 AssetBundle 메뉴에 이름이 표시됩니다. 또한 각 에셋 번들에는 관련된 “.manifest” 확장자 파일이 있습니다. 이 manifest 파일은 텍스트 파일이며 문서 편집기로 열 수 있습니다. 이 파일은 파일 CRC와 에셋 종속성 같은 정보를 제공합니다. 위 예제의 에셋 번들은 다음과 같은 manifest 파일을 가지고 있습니다.

ManifestFileVersion: 0
CRC: 2422268106
Hashes:
  AssetFileHash:
    serializedVersion: 2
    Hash: 8b6db55a2344f068cf8a9be0a662ba15
  TypeTreeHash:
    serializedVersion: 2
    Hash: 37ad974993dbaa77485dd2a0c38f347a
HashAppended: 0
ClassTypes:
- Class: 91
  Script: {instanceID: 0}
Assets:
  Asset_0: Assets/Mecanim/StateMachine.controller
Dependencies: {}

이외에 에셋 번들 파일과 manifest 파일과 같이 두 개의 새로운 파일이 생성됩니다. 두 파일은 에셋 번들이 생성된 폴더 마다 만들어지므로 에셋 번들을 언제나 같은 곳에 생성한다면 두 개의 추가 파일만이 생겨납니다. 추가 매니페스트 파일(예제에서는 AssetBundles.manifest)은 다른 manifest 파일과 비슷한 방식으로 사용될 수 있지만 에셋 번들이 어떻게 서로 연관되고 종속하는지에 대한 정보를 보여줍니다. 이런 경우, 단일 에셋 번들만을 가지고 있기 때문에 달리 종속할 만한 에셋 번들이 존재하지 않습니다.

ManifestFileVersion: 0
AssetBundleManifest:
  AssetBundleInfos:
    Info_0:
      Name: scene1assetbundle
      Dependencies: {}

셰이더 스트리핑(Shader stripping)

셰이더를 번들에 포함할 때, Unity 에디터는 현재 화면과 라이트매핑 설정을 살펴보고 어느 라이트맵 모드를 사용할지 정합니다. 이것은 번들을 만들 때 설정된 씬을 열어놔야 함을 의미합니다.

하지만, 수동으로 어느 씬의 라이트맵 모드를 연산할지를 지정할 수 있습니다. 이것은 번들을 커맨드 라인에서 만들 때 필요합니다.

사용할 씬을 엽니다. Graphics Settings Inspector(Edit > Project Settings > Graphics)에서 Shader stripping/Lightmap modes로 이동한 후, Manual을 선택하고 From current scene을 선택합니다.

에셋 번들 에디터 툴

에셋 번들(AssetBundles) 이름 생성

다음 에디터 스크립트는 빌드 프로세스가 만들 수 있는 에셋 번들의 이름을 표시할 수 있습니다.

using UnityEditor;
using UnityEngine;

public class GetAssetBundleNames
{
    [MenuItem ("Assets/Get AssetBundle names")]
    static void GetNames ()
    {
        var names = AssetDatabase.GetAllAssetBundleNames();
        foreach (var name in names)
            Debug.Log ("AssetBundle: " + name);
    }
}

에셋이 에셋 번들(AssetBundle)을 변경할 때 알림수신

AssetPostprocessor 클래스에서 OnPostprocessAssetbundleNameChanged 메서드를 사용하여 에셋과 연관된 에셋 번들이 변경될 때 콜백을 받을 수 있습니다.

using UnityEngine;
using UnityEditor;

public class MyPostprocessor : AssetPostprocessor {

    void OnPostprocessAssetbundleNameChanged ( string path,
            string previous, string next) {
        Debug.Log("AB: " + path + " old: " + previous + " new: " + next);
    }
}

에셋 번들 배리언트

이 기능은 가상 에셋과 비슷한 결과를 얻기 위해 사용할 수 있습니다. 예를 들어, “MyAssets.hd” 및 “MyAssets.sd”와 같은 에셋 번들 배리언트를 설정할 수 있습니다. 에셋이 완전히 일치하도록 주의해야 합니다. Unity 빌드 파이프라인은 이 두 배리언트 에셋 번들의 오브젝트에 동일한 내부 ID를 부여합니다. 이제 이 두 배리언트 에셋 번들은 런타임 시점에 다른 배리언트 확장자를 가진 에셋 번들과 독자적으로 전환할 수 있습니다.

에셋 번들 배리언트를 설정하는 방법은 다음과 같습니다.

  1. 에디터에서 에셋 레이블 GUI 오른쪽에 있는 추가 배리언트 이름을 사용해야 합니다.
  2. 코드에서 AssetImporter.assetBundleVariant 옵션을 사용해야 합니다.
에셋 번들 배리언트
에셋 번들 배리언트

에셋 번들의 완전한 이름은 에셋 번들과 배리언트의 이름을 조합해서 만들어집니다. 예를 들어, “MyAssets.hd”를 배리언트 에셋 번들로 추가하고 싶다면, 에셋 번들 이름을 “MyAssets”로 설정하고 에셋 번들 배리언트를 “hd”로 설정합니다.

에셋 번들 이름을 “MyAssets.hd”와 같은 이름으로 설정했다면 배리언트 에셋 번들이 되는 것이 아니라 노멀 에셋 번들로 생성 됩니다. “MyAssets”+“hd”와 “MyAssets.hd”+""는 같은 완전한 에셋 번들 이름으로 만들어지므로 공존할 수 없습니다.

스크립팅 어드바이스

에셋을 에셋 번들로 지정하기 위한 API

에셋 번들 빌드(Building AssetBundles)

간단한 API는 에셋 번들 BuildPipeline.BuildAssetBundles()을 만드는 데 쓸 수 있습니다. 다음을 제공해야 합니다.

  • 모든 에셋 번들을 위한 출력 경로.
  • BuildAssetBundleOptions (see below).
  • 이전과 같은 BuildTarget
  • 에셋의 매핑 정보인 AssetBundleBuild 배열을 에셋 번들에 제공하기 위한 오버로드된 버전입니다. 이 버전은 유연성을 제공합니다. 매핑 정보를 스크립트로 설정할 수 있으며 그것으로부터 빌드할 수 있습니다. 이 매핑 정보는 에셋 데이터베이스에 있는 기존의 매핑 정보를 대체하거나 손상시키지 않습니다.

에셋 데이터베이스 안의 에셋 번들 이름을 조작하기 위한 API

BuildAssetBundleOptions

  • CollectDependenciesDeterministicAssetBundle은 언제나 활성화되어 있습니다.
  • CompleteAssets는 항상 오브젝트보다는 에셋으로부터 시작하기 때문에 무시되며, 디폴트값으로 완료되어 있어야 합니다.
  • ForceRebuildAssetBundle가 추가됩니다. 에셋에 변화가 없다 하더라도 이 플래그를 설정하는 것으로 강제적으로 에셋 번들을 다시 빌드할 수 있습니다.
  • IngoreTypeTreeChanges가 추가됩니다. 타입 트리 변경 역시 이 플래그 설정을 통해 무시할 수 있습니다.
  • DisableWriteTypeTreeIngoreTypeTreeChanges와 상충합니다. 타입 트리를 비활성화 했다면 타입 트리 변경을 무시할 수 없습니다.

매니페스트(Manifest) 파일

manifest 파일은 에셋 번들마다 생성되며 다음의 정보를 포함합니다.

  • 매니페스트 파일은 에셋 번들 바로 옆에 위치합니다.
  • CRC.
  • 에셋 파일 해시. 이 에셋 번들에 포함된 모든 에셋을 위한 단일 해시이며 증분 빌드 체크에만 사용됩니다.
  • 타입 트리 해시. 이 에셋 번들에 포함된 모든 타입을 위한 단일 해시이며 증분 빌드 체크에만 사용됩니다.
  • 클래스 타입. 이 에셋 번들에 포함된 모든 클래스 타입입니다. 타입 트리 증분 빌드 체크를 실행 시 새로운 단일 해시를 가져오는데 사용됩니다.
  • 에셋 이름. 모든 에셋은 명백하게 이 에셋 번들 안에 포함됩니다.
  • 종속 에셋 번들 이름. 이 에셋 번들이 종속하는 모든 에셋 번들입니다.
  • 매니페스트 파일은 증분 빌드할 경우에만 사용되며 런타임에는 필요하지 않습니다.

단일 매니페스트 파일

다음 내용을 포함한 단일 manifest 파일을 생성합니다.

  • 모든 에셋 번들.
  • 모든 에셋 번들 종속성

단일 매니페스트 에셋 번들(AssetBundle)

다음의 API를 가진 AssetBundleManifest 오브젝트만을 지닙니다.

에셋 번들(AssetBundle) 로딩 API

타입트리(Typetrees)

타입트리는 기본 설정으로 에셋 번들에 작성됩니다. 유일한 예외는 메트로이며, 다른 종류의 직렬화 솔루션을 사용합니다.

AssetBundles
에셋 번들 압축(Asset Bundle Compression)