Unity 5 이전 버전에서는 에셋을 선택하고 에디터 스크립트만을 사용해서 번들에 추가시켜야 했습니다. (Unity 5에서는 에디터의 툴을 통해 특정 번들에 에셋을 할당할 수 있습니다.) 이 정보는 Unity 4의 레거시 프로젝트를 작업하는 경우와 Unity 4를 사용하고 있다는 전제 하에 제공됩니다.
에셋 번들을 생성하기 위해서는 BuildPipeline 에디터 클래스를 사용해야 합니다. 에디터 클래스를 사용하는 모든 스크립트는 에셋 폴더 안에 있는 에디터 폴더에 위치해야 합니다. 다음은 C# 스크립트의 예제입니다.
// Legacy Unity 4 example. Not for use in Unity 5 & onwards
using UnityEngine;
using UnityEditor;
public class ExportAssetBundles {
[MenuItem("Assets/Build AssetBundle")]
static void ExportResource () {
string path = "Assets/myAssetBundle.unity3d";
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path,
BuildAssetBundleOptions.CollectDependencies
| BuildAssetBundleOptions.CompleteAssets);
}
}
에디터 스크립트는 게임 오브젝트에 적용될 필요는 없으며 대신 에디터에서 사용됩니다. 방금 전의 예제 스크립트는 에디터의 “에셋” 메뉴에서 “에셋 번들 빌드”라는 이름의 새 아이템을 생성합니다.
예제를 사용하는 방법
BuildAssetBundle 함수는 에셋 번들을 생성하고 특정 위치에 저장하는 라인입니다. 첫 파라미터는 에셋 번들로부터 에셋을 로드할 때 mainAsset 프로퍼티로 직접 얻을 수 있는 특별 에셋인 mainAsset을 지정하는 것입니다. 메인 에셋 설정은 필수적인 사항은 아니며 사용하지 않을 경우 파라미터를 null로 설정할 수 있습니다. 두 번째 파라미터는 에셋 번들을 구성할 오브젝트의 배열입니다. 세 번째 파라미터는 에셋 번들이 저장될 디스크 위치입니다. 마지막 파라미터는 에셋 번들을 빌드할 때 사용되는 빌드 플래그 또는 옵션입니다. BuildAssetBundleOptions는 비트와이즈 OR 오퍼레이터를 사용하여 조합할 수 있습니다.
에셋 번들 빌드는 예를 들어 모든 에셋 번들을 빌드하는 메뉴 아이템과 같은 단일 함수 호출을 통해 퍼블리싱 전에 한 번만 실행되어야 합니다. 애플리케이션을 개발할 때 타겟 플랫폼에서 모든 에셋 번들을 사용자 개입없이 단일 클릭 또는 배치 모드에서 빌드할 수 있는 헬퍼 스크립트를 작성해야 합니다.
에셋 번들 빌드에 사용할 수 있는 클래스 메서드는 세 가지가 있습니다.
BuildPipeline.BuildAssetBundle은 모든 타입의 에셋으로 에셋 번들을 빌드할 수 있게 해줍니다.
BuildPipeline.BuildStreamedSceneAssetBundle은 데이터가 사용 가능해졌을 때 오직 씬 만을 스트림하고 로드하려고 할 때 사용됩니다.
BuildPipeline.BuildAssetBundleExplicitAssetNames는 BuildPipeline.BuildAssetBundle과 같지만 각 오브젝트에 대한 커스텀 스트링 식별자(이름)를 지정하기 위한 추가 파라미터를 포함합니다.
에셋 번들 빌드는 에디터의 스크립트를 통해 수행합니다. BuildPipeline.BuildAssetBundle 스크트립 문서에 이에 대한 기본 예제가 있습니다.
예제를 실행하려면 위의 링크에서 ExportAssetBundles라는 이름의 새 C# 스크립트에 스크립트를 복사하고 붙여넣기합니다. 이 스크립트는 Unity 에디터에서 작동하도록 에디터 폴더에 배치합니다.
이제 Asset 메뉴에 새로운 두 개의 메뉴 옵션이 보여야 합니다.
Build AssetBundle From Selection - Track dependencies. 이 옵션은 현재 오브젝트를 에셋 번들로 빌드하고 모든 종속성을 포함시킵니다. 예를 들어 프리팹이 몇 개의 계층 구조 레이어로 구성된 경우 반복적으로 모든 자식 오브젝트와 컴포넌트를 에셋 번들에 추가합니다.
Build AssetBundle From Selection - No dependency tracking. 이 옵션은 앞에서 설명한 메서드의 반대 옵션이며 선택한 단일 에셋만 포함합니다.
예제에서는 새 프리팹을 작성해야 합니다. 먼저 게임 오브젝트(GameObject) > 3D 오브젝트(3D Object) > 큐브(Cube) 로 가서 새 큐브를 생성하면, 계층 구조 뷰에 새 큐브가 만들어집니다. 그 후 계층 구조 뷰에서 큐브를 프로젝트 뷰에 드래그 앤 드롭하면 오브젝트의 프리팹이 만들어집니다.
그 다음으로 프로젝트 창에서 큐브의 프리팹을 마우스 오른쪽 버튼으로 클릭하여 Build AssetBundle From Selection - Track dependencies__를 선택합니다. 이 시점에서 “번들된” 에셋을 저장하라는 창이 나타납니다. “AssetBundles”라는 새 폴더를 만들고 큐브를 Cube.unity3d__로 저장하면 프로젝트 창은 다음과 같이 됩니다.
이 시점에서 AssetBundle Cube.unity3d 를 로컬 저장소로 이동하거나 원하는 서버에 업로드할 수 있습니다.
AssetDatabase.ImportAsset을 사용하여 BuildPipeline.BuildAssetBundle을 호출하기 직전에 에셋 임포트를 다시 한 번 강제로 실시하고 AssetPostprocessor.OnPreprocessTexture를 사용함으로써 필요한 프로퍼티를 설정할 수 있습니다. 아래의 예제는 에셋 번들을 빌드할 때 다양한 텍스처 압축 방식을 설정하는 방법을 보여줍니다.
// Legacy Unity 4 example. Not for use in Unity 5 & onwards.
// Builds an asset bundle from the selected objects in the project view,
// and changes the texture format using an AssetPostprocessor.
using UnityEngine;
using UnityEditor;
public class ExportAssetBundles {
// Store current texture format for the TextureProcessor.
public static TextureImporterFormat textureFormat;
[MenuItem("Assets/Build AssetBundle From Selection - PVRTC_RGB2")]
static void ExportResourceRGB2 () {
textureFormat = TextureImporterFormat.PVRTC_RGB2;
ExportResource();
}
[MenuItem("Assets/Build AssetBundle From Selection - PVRTC_RGB4")]
static void ExportResourceRGB4 () {
textureFormat = TextureImporterFormat.PVRTC_RGB4;
ExportResource();
}
static void ExportResource () {
// Bring up save panel.
string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");
if (path.Length != 0) {
// Build the resource file from the active selection.
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
foreach (object asset in selection) {
string assetPath = AssetDatabase.GetAssetPath((UnityEngine.Object) asset);
if (asset is Texture2D) {
// Force reimport thru TextureProcessor.
AssetDatabase.ImportAsset(assetPath);
}
}
BuildPipeline.BuildAssetBundle(Selection.activeObject,
selection,
path,
BuildAssetBundleOptions.CollectDependencies |
BuildAssetBundleOptions.CompleteAssets);
Selection.objects = selection;
}
}
}
// Legacy Unity 4 example. Not for use in Unity 5 & onwards.
// Changes the texture format when building the Asset Bundle.
using UnityEngine;
using UnityEditor;
public class TextureProcessor : AssetPostprocessor
{
void OnPreprocessTexture() {
TextureImporter importer = assetImporter as TextureImporter;
importer.textureFormat = ExportAssetBundles.textureFormat;
}
}
또한 AssetDatabase.ImportAssetOptions을 사용하여 에셋을 어떻게 임포트할지 조정할 수 있습니다.
테스트 환경에서는 가끔 에셋 번들을 다시 빌드해야 하는 테스트가 필요할 수 있습니다. 이런 경우 BuildAssetBundleOptions.UncompressedAssetBundle 옵션을 사용하여 에셋 번들을 빌드하길 추천합니다. 에셋 번들을 더 빠르게 빌드하고 로드할 수 있지만 파일이 커지기 때문에 다운로드하는 데 시간이 더 걸립니다.
에셋 번들을 처음 사용할 때, 이전 예제에서 보았듯이 수동으로 빌드하는 것이 충분해 보일 수 있습니다. 그러나 프로젝트의 덩치가 커지고 에셋의 수가 증가하면 수동으로 작업하는 것은 효율적이지 못합니다. 더 나은 방법은 프로젝트에서 모든 에셋 번들을 빌드하는 함수를 작성하는 것입니다. 예를 들어, 에셋 파일을 매핑하여 에셋 번들 파일로 만드는 텍스트 파일을 이용할 수 있습니다.