Version: 2021.1
Preparando Assets para AssetBundles
Dependencias AssetBundle

Construyendo AssetBundles

En la documentación acerca del flujo de trabajo de los AssetBundles, tenemos una muestra de código que pasa tres argumentos a la función BuildPipeline.BuildAssetBundles. Vamos a profundizar un poco más en lo que en realidad estamos diciendo.

Assets/AssetBundles: Este es el directorio en el que se mostrarán los AssetBundles. Puede cambiar esto a cualquier directorio de salida que desee, solo asegúrese de que la carpeta realmente exista antes de intentar una compilación.

BuildAssetBundleOptions

Hay diferentes BuildAssetBundleOptions que usted puede especificar que tienen una variedad de efectos. Mire la Referencia del Scripting API en BuildAssetBundleOptions para una tabla de todas las opciones.

Si bien puede combinar BuildAssetBundleOptions a medida que cambian y surgen las necesidades, hay tresBuildAssetBundleOptions específicas que se ocupan de la compresión de AssetBundle:

  • BuildAssetBundleOptions.None: This bundle option uses LZMA Format compression, which is a single compressed LZMA stream of serialized data files. LZMA compression requires that the entire bundle is decompressed before it’s used. This results in the smallest possible file size but a slightly longer load time due to the decompression. It is worth noting that when using this BuildAssetBundleOptions, in order to use any assets from the bundle the entire bundle must be uncompressed initially.
    Once the bundle has been decompressed, it will be recompressed on disk using LZ4 compression which doesn’t require the entire bundle be decompressed before using assets from the bundle. This is best used when a bundle contains assets such that to use one asset from the bundle would mean all assets are going to be loaded. Packaging all assets for a character or scene are some examples of bundles that might use this.
    Using LZMA compression is only recommended for the initial download of an AssetBundle from an off-site host due to the smaller file size. LZMA compressed asset bundles loaded through UnityWebRequestAssetBundle are automatically recompressed to LZ4 compression and cached on the local file system. If you download and store the bundle through other means, you can recompress it with the AssetBundle.RecompressAssetBundleAsync API.

  • BuildAssetBundleOptions.UncompressedAssetBundle: Esta opción de bundle crea los bundles de tal manera que los datos están completamente descomprimidos. La desventaja de estar sin comprimir es el mayor tamaño de descarga de archivos. Sin embargo, los tiempos de carga una vez descargados serán mucho más rápidos.

  • BuildAssetBundleOptions.ChunkBasedCompression: Esta opción del bundle utiliza un método de compresión conocido como LZ4, que da como resultado tamaños de archivo comprimido más grandes que LZMA, pero no requiere que todo el paquete se descomprima, a diferencia de LZMA, antes de que pueda ser utilizado. LZ4 usa un algoritmo basado en fragmentos que permite que el AssetBundle se cargue en trozos o “trozos”. Descomprimir un solo fragmento permite que los activos contenidos se usen incluso si los otros fragmentos del AssetBundle no se descomprimen.

El uso de ChunkBasedCompression tiene tiempos de carga comparables a los bundles sin comprimir con el beneficio adicional de reducir el tamaño en el disco.

BuildTarget (objetivo de construcción)

BuildTarget.Standalone: Aquí le estamos diciendo a la pipeline deconstrucción qué plataforma de destino vamos a utilizar con estos AssetBundles. Puede encontrar una lista de los objetivos de construcción explícitos disponibles en la Referencia de API de scripting paraBuildTarget. Sin embargo, si prefieres no codificar en su objetivo de construcción, no dude en aprovechar el EditorUserBuildSettings.activeBuildTarget, que buscará automáticamente la plataforma en la que está configurado para compilar y construirá sus AssetBundles en función de ese objetivo.

Una vez que haya configurado correctamente su script de consrucción, finalmente es hora de construir sus paquetes. Si siguió el ejemplo del script anterior, haga clic en Assets > Build AssetBundles para iniciar el proceso.

Ahora que ha creado con éxito sus AssetBundles, puede observar que su directorio AssetBundles tiene más archivos de los que esperaba originalmente. 2*(n + 1) más archivos, para ser exactos. Tomemos un minuto y repasemos exactamente lo que arroja BuildPipeline.BuildAssetBundles.

Para cada AssetBundle que usted específica en el editor, notará un archivo con el nombre de su AssetBundle y el nombre de su AssetBundle + “.manifest”.

Habrá un bundle adicional y manifest que no comparte un nombre con ningún AssetBundle que haya creado. En su lugar, lleva el nombre del directorio en el que se encuentra (donde se crearon los AssetBundles). Este es el Manifest Bundle. Discutiremos más acerca de esto y cómo usarlo en el futuro.

El Archivo AssetBundle

Este es el archivo que carece de una extensión .manifest y lo que estará cargando en tiempo de ejecución con el fin de cargar sus Assets.

El archivo AssetBundle es un archivo que contiene vario archivos interamente. La estrucctura de este archivo puede cambiar un poco dependiendo si es un AssetBundle o un AssetBundle de Escena. Esta es la estructura normal de un AssetBundle:

El AssetBundle de Escena es diferente a un AssetBundles normales, este es optimizado para la carga de secuencia de una Escena y su contenido.

El Archivo Manifest

Para cada bundle generado, incluido el Manifest Bundle adicional, se genera un archivo de manifiesto asociado. El archivo de manifiesto se puede abrir con cualquier editor de texto y contiene información como datos de verificación de redundancia cíclica (CRC) y datos de dependencia para el paquete. Para los AssetBundles normales, su archivo de manifiesto tendrá el siguiente aspecto:

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

Que muestra los assets contenidos, dependencias, y más información.

El Manifest Bundle que fue generado tendrá un manifest, pero ser verá más así:


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

Esto mostrará cómo se relacionan los AssetBundles y cuáles son sus dependencias. Por ahora, entienda que este bundle contiene el objeto AssetBundleManifest que será increíblemente útil para determinar qué dependencias del bundle a cargar en tiempo de ejecución. Para obtener más información acerca de cómo usar este paquete y el objeto manifiesto, consulte la documentación en Cómo usar AssetBundles de forma nativa.

Preparando Assets para AssetBundles
Dependencias AssetBundle