AssetBundles
Compresión de Asset Bundles

Construyendo Asset Bundles

Para comenzar a crear un Asset Bundle, usted primero necesita seleccionar un asset desde la carpeta del proyecto que a usted le gustaría incluir en un bundle. Al final de la ventana del inspector para ese asset, hay un menú Asset Bundle. Al hacer click se va a revelar los nombres de cualquier asset bundles actualmente definidos, además de la opción de definir un nuevo bundle:

Creación AssetBundle
Creación AssetBundle

Si usted todavía no ha definido el bundle, haga click en ‘New’, e ingrese un nombre para su bundle.

Then, to add further assets to this bundle, use the menu at the bottom of the Inspector window to select an asset in the Project window and assign it to the named bundle.

Por defecto, la opción del AssetBundle para Asset es configurada a ninguna significando que el Asset no será escrito a un AssetBundle y más bien estará empaquetado con el proyecto principal en sí mismo. Utilizando este menú, usted puede crear uno o más Asset Bundles, darle nombres, y luego utilizar esto nuevos nombres de AssetBundle como el destino para el asset.

Creación de AssetBundle
Creación de AssetBundle

En esta foto el Asset asset ha sido agregado a un AssetBundle llamado environment/desert. Este AssetBundle puede contener otros assets que han sido previamente agregados. Los nombres de los AssetBundle siempre están en minúscula. Si usted utilizar caracteres de mayúscula en el nombre estos serán convertidos a minúscula. Utilizando una barra inclinada en el nombre del AssetBundle efectivamente crea carpetas, y el menú tendrá submenus, como el te la foto de arriba muestra.

Si usted crea AssetBundles que no tienen assets asignados a estos, entonces la opción "Remove Unused Names) puede ser utilizada. Esto va a borrar el AssetBundle vacío.

El archivo meta perteneciendo a un Asset va a tener el nombre del AssetBundle escogido escrito en él.

Exportando AssetBundles

Los AssetBundles son exportados del editor utilizando código script. El siguiente script exporta AssetBundles:

using UnityEditor;

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

Este script crea un item de menú al final del menú Assets. Cuando usted selecciona este item del menú para llamar la función y construir los AssetBundles, usted verá un dialogo de construcción con una barra de progreso. La función BuildPipeline.BuildAssetBundles crea los AssetBundles que han sito etiquetados, y los coloca a una carpeta output llamada “AssetBundles”. (Por favor tenga en cuenta que usted necesita crear la carpeta “AssetBundles” en la carpeta de su proyecto con anterioridad de correr este script.)

Cada AssetBundle que es exportado tendrá el mismo nombre creado en el menú AssetBundle. Adicionalmente, cada AssetBundle tendrá un archivo asociado con una extensión -manifest. Este archivo manifest es un archivo texto que usted puede abrir con cualquier editor de texto. Este proporciona información como el CRC del archivo y las dependencias del asset. El AssetBundle en este ejemplo de arriba tiene un archivo manifest que se ve así:

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: {}

Adicionalmente a estos, hay otros archivos creados: OTro AssetBundle y otro archivo manifest. Estos dos siempre son creados cuando los AssetBundles son creados. Estos son creados para cada carpeta que los AssetBundles son creados, y por lo tanto si usted siempre crea AssetBundles en el mismo lugar usted obtendrá solamente dos archivos extra. El archivo manifest adicional - en este ejemplo AssetBundles.manifest - puede ser utilizado de la misma manera que otros archivos manifest pero mostrarán información acerca de cómo los AssetBundles se relacionan y dependen de cada uno. En este caso, ya que nosotros solamente tenemos un solo AssetBundle, no tiene otras dependencias.

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

Shader stripping

When you include shaders in your bundle, the Unity editor looks at the current scene and lightmapping settings to decide which Lightmap modes to use. This means that you need to have a configured scene open when building the bundle.

However, you can also manually specify which scene to calculate Lightmap modes from. This is necessary when building bundles from the command line.

Open the scene you would like to use. In the Graphics Settings Inspector (Edit > Project Settings > Graphics), go to Shader stripping/Lightmap modes and select Manual, then select From current scene.

Herramientas de Edición del AssetBundle

Obteniendo nombres de AssetBundles

El siguiente script del editor puede mostrar los nombres de AssetBundles los cuales el proceso de construcción pueden crear.

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);
    }
}

Decirme cuando un asset cambia AssetBundle

Usted puede utilizar el método OnPostprocessAssetbundleNameChanged de la clase AssetPostprocessor, para obtener un callback cuando el AssetBundle, un asset es asociado con cambios.

using UnityEngine;
using UnityEditor;

public class MyPostprocessor : AssetPostprocessor {

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

Variantes de AssetBundle

Las Variantes de AssetBundle es una nueva características de 5.x. Estas pueden ser utilizadas para lograr un resultado similar a unos assets virtuales. Por ejemplo, usted puede configurar un AssetBundle como una variante como “MyAssets.hd” y “MyAssets.sd”. Asegúrese de que los assets coincidan exactamente. Los objetos en estas dos variantes de AssetBundles van a tener el mismo IDs internos el cual son asegurados por el pipeline de construcción de Unity. Por lo que estas dos variantes de AssetBundles van a ser cambiadas arbitrariamente con AssetBundles de diferentes extensiones de variante en tiempo de ejecución.

Cómo configurar variantes de Assetbundle:

  1. Desde el editor utilice una variante de nombre extra, a la derecha de la etiqueta de asset GUI.
  2. En código utilice la opción AssetImporter.assetBundleVariant
Variantes de AssetBundle
Variantes de AssetBundle

El nombre completo de AssetBundle va a ser la combinación del nombre del AssetBundle y el nombre de la variante. Por ejemplo, si usted quiere agregar “MyAssets.hd” como un AssetBundle de variante, usted debería configurar el nombre del AssetBundle a “MyAssets” y la variante de AssetBundle a “hd”. Y el AssetBundle final es “MyAssets.hd”.

Pero si usted solamente configura el nombre del AssetBundle como “MyAssets.hd”, entonces este es solamente un AssetBundle normal que no es un AssetBundle variante. “MyAssets”+“hd” y “MyAssets.hd”+””no pueden co-existir ya que pueden llevar al mismo nombre del AssetBundle completo.

Consejos de Scripting

API para marcar el asset a un AssetBundle

Construyendo Asset Bundles

APIs más simples están disponible para construir AssetBundles, BuildPipeline.BuildAssetBundles(). Estos APIs son bastante simple, usted solamente necesita proporcionar:

  • La ruta output para todos loas AssetBundles.
  • BuildAssetBundleOptions que será descrito después.
  • BuildTarget que es lo mismo que antes.
  • También tenga una versión sobrecargada para proporcionar un arreglo de AssetBundleBuild que contienen un mapa de los assets a los AssetBundles. Esto proporciona flexibilidad para usted, usted puede configurar la información de mapping por script y construirla. Y esta información de mapping no va a romper/remplazar la existente en la base de datos de assets.

APIs para manipular los nombres de AssetBundle en la base de datos de assets

BuildAssetBundleOptions

BuildAssetBundleOptions

Archivo Manifest

Un archivo manifest es creado para cada AssetBundle que contiene la siguiente información:

  • El archivo manifest está alado del AssetBundle.
  • CRC
  • El hash de un archivo Asset. Un solo hash para todos los assets incluidos en este AssetBundle, solamente utilizarlo para una revisión de construcción incremental.
  • El hash del Type tree. Un solo hash para todos los tipos incluidos en este AssetBundle, solamente utilizarlo para una revisión incremental de construcción.
  • Tipos de clases. todos los tipos de clase incluidos en el AssetBundle. Estos son utilizados para obtener un solo hash nuevo cuando se haga la revisión de la construcción incremental del type tree.
  • Nombres de los Asset. Todos los assets explícitamente incluyen este AssetBundle.
  • Los nombres de AssetBundle dependientes. Todos los AssetBundles que este AssetBundle depende.
  • Este archivo manifest es solamente utilizada para construcciones incrementales, no son necesarias para el tiempo de ejecución.

Un solo archivo manifest

Nosotros generamos un solo archivo manifest que incluye:

  • Todos los AssetBundles.
  • Todas las dependencias de AssetBundle.

Un solo manifest AssetBundle

Solamente contiene un objeto AssetBundleManifest que tiene las siguiente APIs:

El APIs para cargar AssetBundles ha cambiado

Typetrees (TiposDeÁrboles)

Un typetree es escrito al AssetBundle por defecto. La única excepción es Metro ya que tiene una solución de serialización diferente.

AssetBundles
Compresión de Asset Bundles