How do I extract files from a folder in Unity?

AssetBundles en Unity: La Guía Definitiva

23/12/2012

Valoración: 3.91 (15122 votos)

En el vasto universo del desarrollo de videojuegos con Unity, existen herramientas y conceptos que marcan la diferencia entre un proyecto amateur y uno profesional, escalable y optimizado. Uno de los pilares fundamentales en esta distinción son los AssetBundles. Si alguna vez te has preguntado cómo los grandes juegos gestionan gigabytes de contenido, implementan contenido descargable (DLC) o reducen su tamaño de instalación inicial para ser más atractivos en las tiendas de aplicaciones, la respuesta casi siempre involucra un uso inteligente de este sistema. Esta guía completa te llevará desde los conceptos más básicos hasta las técnicas avanzadas, desmitificando todo lo que necesitas saber para convertirte en un experto en la gestión de assets en Unity.

How do I add an Asset Bundle to a Unity project?
An Asset Bundle can be dropped directly into any Unity project with a version of 5.6 or greater. It will create a new menu item in Window > AssetBundle Browser. The bundle configuration and build functionality are split into two tabs within the new window.
Índice de Contenido

¿Qué es Exactamente un AssetBundle?

Imagina un AssetBundle como un contenedor o un paquete de archivos, muy similar a un archivo .zip, pero diseñado específicamente para el ecosistema de Unity. Este contenedor no guarda archivos de código (scripts C#), sino que almacena assets no codificados y específicos de una plataforma, como modelos 3D, texturas, prefabs, clips de audio e incluso escenas completas. Unity puede cargar estos paquetes en tiempo de ejecución, es decir, mientras el juego ya está en marcha.

Podemos hablar de "AssetBundle" en dos contextos:

  • El Archivo Físico: Es el archivo que reside en el disco o en un servidor, con una extensión propia. Este archivo es un archivo de almacenamiento que contiene dos tipos de datos: un archivo serializado (donde tus assets se descomponen en objetos individuales) y archivos de recursos (fragmentos de datos binarios para assets como texturas y audio, que permiten una carga más eficiente y en hilos separados).
  • El Objeto en Código: Dentro de tu script, interactúas con un objeto de tipo AssetBundle. Este objeto se crea al cargar el archivo físico y contiene un mapa de todos los assets que incluiste en él, permitiéndote acceder a ellos por su nombre.

La principal ventaja es que estos assets no forman parte de la compilación principal de tu juego. Viven de forma externa y se pueden cargar, actualizar y descargar de forma independiente, abriendo un mundo de posibilidades para la optimización y la distribución de contenido.

Las Ventajas Clave de Usar AssetBundles

Adoptar un flujo de trabajo con AssetBundles puede parecer complejo al principio, pero los beneficios a largo plazo son inmensos. Aquí detallamos las razones más importantes para integrarlos en tu proyecto.

1. Contenido Descargable (DLC) y Actualizaciones Dinámicas

Esta es quizás la aplicación más conocida. Los AssetBundles son el mecanismo perfecto para implementar DLC. Puedes lanzar tu juego base y, posteriormente, ofrecer nuevos niveles, personajes, skins o ítems como paquetes descargables. Un ejemplo claro: un juego de carreras podría permitir a los usuarios descargar solo los coches que quieren conducir, en lugar de forzar una descarga inicial masiva con todos los vehículos disponibles.

2. Reducción del Tamaño de la Build Inicial

En plataformas móviles, el tamaño de la aplicación es crítico. Muchas tiendas tienen límites para las descargas a través de datos móviles, y los usuarios son reacios a instalar aplicaciones que ocupan demasiado espacio. Al externalizar assets pesados (como cinemáticas, niveles de alta resolución o contenido de etapas avanzadas del juego) en AssetBundles, puedes mantener el tamaño inicial de la instalación al mínimo y descargar el contenido adicional la primera vez que el usuario lo necesite.

How do i compress asset bundles in Unity?
You can also compress AssetBundles using LZMA or LZ4 to efficiently distribute the archives. To build and define AssetBundles, you can use the high-level Addressables package, which provides a way of defining and building AssetBundles from the Unity Editor.

3. Optimización de Memoria en Tiempo de Ejecución

Cargar todos los assets de un juego en memoria al inicio es insostenible y llevaría a tiempos de carga eternos y un consumo de RAM desorbitado. Los AssetBundles te permiten cargar assets solo cuando son necesarios y descargarlos de la memoria cuando ya no se usan. Esto reduce drásticamente la presión sobre la memoria, lo que resulta en un rendimiento más fluido y estable, especialmente en dispositivos de gama baja.

4. Assets Específicos por Plataforma

Cada plataforma (PC, Android, iOS, consolas) tiene sus propias optimizaciones y formatos de texturas. Con los AssetBundles, puedes crear paquetes específicos para cada plataforma. De esta manera, un usuario de Android descargará un bundle con texturas comprimidas en formato ASTC, mientras que un usuario de iOS recibirá uno con PVRTC. Esto asegura el máximo rendimiento y calidad visual para cada dispositivo sin inflar el tamaño del juego con formatos innecesarios.

Creando tu Primer AssetBundle: Guía Paso a Paso

La creación de AssetBundles en las versiones modernas de Unity se realiza exclusivamente a través de scripts. A continuación, te mostramos el proceso estándar.

Paso 1: El Script de Creación

Primero, necesitas un script de editor que añada la funcionalidad de construir los bundles al menú de Unity. Crea una carpeta llamada Editor dentro de tu carpeta Assets (es importante que se llame así). Dentro de ella, crea un nuevo script C# llamado CreateAssetBundles.cs y pega el siguiente código:

using UnityEditor; using System.IO; public class CreateAssetBundles { [MenuItem("Assets/Build AssetBundles")] static void BuildAllAssetBundles() { string assetBundleDirectory = "Assets/StreamingAssets"; if(!Directory.Exists(assetBundleDirectory)) { Directory.CreateDirectory(assetBundleDirectory); } BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget); } } 

Este script simple crea una nueva opción de menú en Assets > Build AssetBundles. Cuando la ejecutes, creará los bundles en la carpeta Assets/StreamingAssets, un directorio especial cuyo contenido se copia tal cual en la build final.

Paso 2: Asignar Assets a un Bundle

Ahora, asignemos un asset. Por ejemplo, un prefab.

What is an asset bundle in Unity?
An AssetBundle is an archive file that contains platform-specific non-code Assets (such as Models, Textures, Prefabs, Audio clips, and even entire Scenes) that Unity can load at run time. AssetBundles can express dependencies between each other; for example, a Material in one AssetBundle can reference a Texture in another AssetBundle.
  1. Selecciona el asset que quieres empaquetar en la ventana de Proyecto.
  2. En la ventana del Inspector, en la parte inferior, verás una sección para "AssetBundle".
  3. Haz clic en el menú desplegable (que por defecto dice "None") y selecciona "New...".
  4. Dale un nombre a tu bundle, por ejemplo, personajes/heroe. Puedes usar barras para organizar tus bundles en subdirectorios. Pulsa Enter.

¡Listo! Has asignado ese asset a un AssetBundle. Puedes asignar múltiples assets al mismo bundle. Ahora, cuando vayas a Assets > Build AssetBundles, Unity generará el archivo correspondiente en la carpeta StreamingAssets.

Compresión y Opciones de Build

No todos los AssetBundles son iguales. La forma en que los construyes puede tener un gran impacto en el rendimiento. La compresión es un factor clave.

Tipo de CompresiónVentajasDesventajasCaso de Uso Ideal
LZMA (Por defecto)Ratio de compresión muy alto, archivos muy pequeños.Requiere descomprimir todo el bundle en memoria antes de poder usarlo, lo que puede causar un pico de uso de CPU y RAM.Contenido que se descarga una sola vez y se almacena localmente, como un DLC grande o el paquete de assets inicial.
LZ4Compresión por bloques. Descompresión extremadamente rápida. No requiere descomprimir todo el bundle para leer un asset.El tamaño del archivo es mayor que con LZMA.Assets que se cargan y descargan frecuentemente durante el juego, como los recursos de un nivel específico.
Sin compresiónCarga más rápida posible.Archivos de mayor tamaño.Cuando el tamaño del archivo no es una preocupación y la velocidad de carga es absolutamente crítica. Útil durante el desarrollo y para builds locales.

Puedes elegir el tipo de compresión al llamar a BuildPipeline.BuildAssetBundles, usando las BuildAssetBundleOptions. Por ejemplo, BuildAssetBundleOptions.ChunkBasedCompression para usar LZ4.

Cargando AssetBundles en tu Juego

Una vez creado el bundle, el siguiente paso es cargarlo en tu juego. Existen varios métodos, cada uno adaptado a una necesidad diferente.

Carga Síncrona (Local)

Este es el método más simple. Se utiliza para cargar un bundle que ya está en el dispositivo del usuario (por ejemplo, en la carpeta StreamingAssets). La carga es síncrona, lo que significa que el juego se detendrá y esperará a que la carga finalice.

How do I create an AssetBundle in Unity?
To create an AssetBundle in Unity, select the Asset or Assets in your project folder that you wish to make into an AssetBundle and then select Build AssetBundle from the Assets menu. Click ‘Save’ to create the AssetBundle. The first line of the ExportResource function sets the path of your AssetBundle.

var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "mi_bundle")); if (myLoadedAssetBundle == null) { Debug.LogError("Failed to load AssetBundle!"); return; } var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MiPrefab"); Instantiate(prefab); 

Advertencia: Usa este método con precaución. Si el bundle es grande, puede causar un congelamiento notable en el juego. Es adecuado para bundles pequeños o pantallas de carga.

Carga Asíncrona (Local)

Para evitar congelamientos, la carga asíncrona es la solución. Se ejecuta en segundo plano, permitiendo que el juego siga corriendo sin interrupciones. Se implementa usando Coroutines.

IEnumerator LoadAssetBundleAsync(string bundleName) { AssetBundleCreateRequest asyncLoadRequest = AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath, bundleName)); yield return asyncLoadRequest; AssetBundle myLoadedAssetBundle = asyncLoadRequest.assetBundle; if (myLoadedAssetBundle == null) { Debug.LogError("Failed to load AssetBundle!"); yield break; } AssetBundleRequest assetLoadRequest = myLoadedAssetBundle.LoadAssetAsync<GameObject>("MiPrefab"); yield return assetLoadRequest; GameObject prefab = assetLoadRequest.asset as GameObject; Instantiate(prefab); myLoadedAssetBundle.Unload(false); } 

Este es el método preferido para una experiencia de usuario fluida.

Carga desde un Servidor Web

Para DLCs y contenido dinámico, necesitarás cargar los bundles desde una URL. Unity proporciona una forma sencilla de hacerlo a través de UnityWebRequestAssetBundle.

IEnumerator DownloadAndLoadBundle(string uri) { using (UnityWebRequest uwr = UnityWebRequestAssetBundle.GetAssetBundle(uri)) { yield return uwr.SendWebRequest(); if (uwr.result != UnityWebRequest.Result.Success) { Debug.Log(uwr.error); } else { AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(uwr); // Usa el bundle como en los ejemplos anteriores } } } 

El Futuro es "Addressable": La Evolución de los AssetBundles

Es importante mencionar que, aunque comprender los AssetBundles es crucial, Unity ha desarrollado un sistema de alto nivel para simplificar todo este proceso: el paquete Addressables. El sistema Addressable gestiona la creación y carga de AssetBundles por ti, permitiéndote referenciar assets por una "dirección" (un nombre simple) en lugar de preocuparte por rutas de archivos, URLs o dependencias manuales. Abstrae toda la complejidad y es el método recomendado por Unity para la gestión de assets en proyectos nuevos. Sin embargo, por debajo, sigue utilizando el potente sistema de AssetBundles que hemos descrito.

How do I unload unused asset bundles?

Preguntas Frecuentes (FAQ)

¿Puedo incluir scripts de C# en un AssetBundle?

No. Los AssetBundles no pueden contener archivos de código fuente ni ensamblados (.dll). Sin embargo, pueden contener assets como los ScriptableObjects, que son instancias de clases que ya existen en tu proyecto. El código debe estar incluido en la build principal del juego.

¿Los AssetBundles son compatibles entre diferentes versiones de Unity?

Generalmente, los AssetBundles creados con una versión antigua de Unity son compatibles con versiones más nuevas. Sin embargo, lo contrario no es cierto: no puedes usar un bundle creado en Unity 2022 en un proyecto de Unity 2020. La mejor práctica es siempre construir tus bundles con la misma versión de Unity que usarás para tu juego final.

¿Cuál es la diferencia entre la carpeta Resources y los AssetBundles?

La carpeta Resources es un sistema más antiguo y simple. Todo lo que está dentro de ella se empaqueta en la build principal del juego, aumentando su tamaño. No ofrece la flexibilidad de carga y descarga bajo demanda ni las actualizaciones remotas de los AssetBundles. Se recomienda evitar su uso en proyectos grandes y optar siempre por AssetBundles o el sistema Addressables.

Conclusión

Los AssetBundles son una herramienta increíblemente poderosa y esencial en el arsenal de cualquier desarrollador de Unity serio. Permiten crear experiencias de juego más grandes, más dinámicas y más optimizadas. Aunque el sistema Addressables ahora ofrece una capa de abstracción más amigable, comprender los principios fundamentales de cómo funcionan los AssetBundles te dará un control total sobre la gestión de contenido y el rendimiento de tu proyecto. Dominarlos es, sin duda, un paso de gigante hacia el desarrollo de juegos profesionales.

Si quieres conocer otros artículos parecidos a AssetBundles en Unity: La Guía Definitiva puedes visitar la categoría Juegos.

Subir