Para crear un Asset Bundle usted necesita utilizar la clase del editor BuildPipeline. Todos los scripts utilizando las clases del Editor deben estar colocadas en una carpeta llamada Editor, dónde sea en la carpeta Assets. Aquí hay un ejemplo de dicho script en 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);
}
}
Un script del editor no necesita ser aplicado a un GameObject, en vez es utilizado por el editor. Este ejemplo previo va a crear un nuevo item en el menú “Assets” de su editor llamado “Build AssetBundle”.
Para usar este ejemplo:
La función BuildAssetBundle es la linea que crea el AssetBundle y lo guarda en una ubicación específica. El primer parámetro específica el mainAsset (asset principal), el cual es un Asset especial que puede ser obtenido directamente con la propiedad mainAsset cuando cargue assets desde el AssetBundle. No es obligatorio configurar un Asset principal, si este no será utilizado usted puede utilizar null (null) como parámetro. El segundo parámetro es el arreglo de objetos que va a componer el AssetBundle. El tercer parámetro es la ubicación en disco en dónde será guardado el AssetBundle. Los parámetros finales son las build flags u opciones utilizadas cuando construye AssetBundles. Estas BuildAssetBundleOptions pueden ser combinadas utilizando el operador OR.
Construir AssetBundles debería ser un paso previo a la publicación que sucede solo una vez y con un solo llamado de función, por ejemplo, con un Item de Menú que construye todos los AssetBundles. A medida que usted desarrolle su aplicación usted debería escribir scripts de ayuda que construyan todos sus AssetBundles para una plataforma destino con un solo clic o en batchmode sin la intervención de un usuario.
Hay tres métodos de clase que puedes usar para construir AssetBundles:
BuildPipeline.BuildAssetBundle te permite contruir AssetBundles con cualquier tipo de asset.
BuildPipeline.BuildStreamedSceneAssetBundle es usado cuando quieres incluir sólo escenas para ser transmitidas y cargadas cuando los datos se vuelvan disponibles.
BuildPipeline.BuildAssetBundleExplicitAssetNames es lo mismo que BuildPipeline.BuildAssetBundle pero tiene un parámetro extra para especificar un identificador string personalizado (name) para cada objeto.
La construcción de AssetBundles se hace a través del editor de scripting. Existen un ejemplo básico de esto en la documentación de scripting para BuildPipeline.BuildAssetBundle.
Para propósitos de este ejemplo, copia y pega el script desde el enlace de arriba en un nuevo script de C# llamado ExportAssetBundles. Este script debe colocarse en una carpeta llamada Editor, para que pueda funcionar dentro del Unity Editor.
Ahora en el menú Assets, deberías ver dos nuevas opciones en el menú.
Build AssetBundle From Selection - Track dependencies. Permitirá construir el objeto actual en un AssetBundle e incluir todas sus dependencias. Por ejemplo, si tienes un prefab que contiene varias capas jerárquicas entonces agregará recursivamente todos los objetos hijos y los componentes al AssetBundle.
Build AssetBundle From Selection - No dependency tracking. Hace lo opuesto del método anterior, y sólo se incluirán los assets que hayan sido seleccionados.
Para este ejemplo, usted debería crear un nuevo prefab. Primero cree un nuevo Cube al ir a GameObject > 3D Object > Cube, el cual va a crear un nuevo cube en la vista de Jerarquía. Luego arrastre el Cube de la Jerarquía a la vista del Proyecto, el cual creará un prefab para ese objeto.
Despúes debes hacer clic derecho sobre el prefab de Cube en el Project View y seleccionas Build AssetBundle From Selection - Track dependencies. A este punto aparecerá una ventana para guardar los assets “empaquetados”. Si creaste un nuevo folder llamado “AssetBundles” y guardaste el cubo como Cube.unity3d, en tu Project View ahora se mostrara algo como esto:
A este punto puedes mover el AssetBundle Cube.unity3d a cualquier parte en tu almacenamiento local, o subirlo a un servidor de tu elección.
Puedes usar AssetDatabase.ImportAsset para forzar la reimportación de un asset justo antes de llamar a BuildPipeline.BuildAssetBundle, y luego usar AssetPostprocessor.OnPreprocessTexture para colocar las propiedades requeridas. El siguiente ejemplo te mostrará cómo colocar diferentes compresiones de textura cuando construyes el AssetBundle.
// 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;
}
}
Puedes también controlar la forma en que el asset será importado usando los AssetDatabase.ImportAssetOptions.
En un ambiente de prueba, usted a veces necesita probar un cambio que requiere que los AssetBundles sean re-construidos. En estos casos, sea aconseja utilizar la opción BuildAssetBundleOptions.UncompressedAssetBundle cuando usted construya los AssetBundles. Esto hace que sea más rápido construir y cargar los AssetBundles pero también serán más grandes y por lo tanto tomarán más tiempo en descargar.
Cuando utilice AssetBundles por primera vez, puede parecer suficiente construirlos manualmente como se ve en el ejemplo previo. Pero a medida que un proyecto crece en tamaño y el número de assets aumenta, hacer este proceso a mano no es eficiente. Un mejor acercamiento es escribir una función que construya todos los AssetBundles para un proyecto. Usted puede, por ejemplo, utilizar un archivo de texto que mapea archivos Asset a archivos AssetBundle.