Asset Bundles Legacy (Viejos)
Manejando dependencias de Asset en Unity 4

Creando Asset Bundles en Unity 4

  • En versiones previas de Unity 5, los assets tenían que estar seleccionados y agregados a bundles utilizando solamente scripts del editor. (En Unity 5, nosotros proporcionamos herramientas en el editor para asignar assets a Bundles específicos). Esta información se diligencia para aquellos que estén trabajando en proyectos de legado en Unity 4, y parte que usted está utilizando Unity 4.*

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:

  • Cree un archivo script C# llamado ExportAssetBundles.cs, dentro de una carpeta llamada Editor, en la Vista del Proyecto.
  • Seleccione el Asset o Assets en su carpeta del proyecto que usted desea volver a un AssetBundle.
  • Seleccione Build AssetBundle del menú Assets. Haga click en “Save” para crear el AssetBundle.
  • La primera linea de la función ExportResource configura la ruta de su AssetBundle.
  • La siguiente linea configura la seleccione en ser hecha a un AssetBundle a medida que los objetos son seleccionados en la ventana del Proyecto.

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:

Un ejemplo de cómo construir un AssetBundle

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ú.

  1. 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.

  2. 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.

Un ejemplo de cómo cambiar las propiedades de los assets cuando se construye un AssetBundle

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.

Construir AssetBundles en un ambiente de producción

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.

Asset Bundles Legacy (Viejos)
Manejando dependencias de Asset en Unity 4