Unity 6.6 jubila los AssetBundles: la compilación incremental de Slime Rancher 2 baja de 32 minutos a tres
Unity ha publicado en la versión 6.6 los content directories, una nueva forma de empaquetar y cargar contenido que los desarrolladores del motor califican abiertamente de sustituta de los AssetBundles. La diferencia principal es que el runtime ahora direcciona, carga y descarga artefactos individuales —una malla o una textura concretas, por ejemplo— y no el bundle entero. La composición de los bundles, para la que los equipos llevaban años ideando estrategias de agrupación, deja de ser una decisión de diseño.
Unity aporta cifras de un proyecto real: Slime Rancher 2, migrado de Addressables a content directories. La compilación incremental pasó de 32 minutos y 16 segundos a 3 minutos y 4 segundos; la compilación limpia, de 58 minutos y 6 segundos a 37 minutos y 13 segundos. El juego compilado adelgazó de 4 GB a 2,88 GB y la carga se aceleró de 45 a 30 segundos, alrededor de un tercio. Las mediciones se hicieron en Unity 6.6 Beta (6000.6.0b10) en un MacBook Pro con M5 Max.
Por qué el bundle como unidad de carga dejó de servir
Un AssetBundle es una unidad indivisible de distribución, almacenamiento y carga. Las dependencias se rastrean a nivel de bundle, y hay que cargarlo y descargarlo por completo. De ahí todo el trabajo asociado: repartir a mano los assets en grupos, seguir las cadenas de dependencias, pelearse con la duplicación de recursos compartidos entre bundles.
Los content directories están construidos de otra manera. Unity emplea un esquema de almacenamiento direccionable por contenido, la misma idea que sustenta git: cada archivo de contenido se nombra y se direcciona mediante un hash de su propio contenido. La deduplicación deja de ser tarea del desarrollador y pasa a ser una propiedad del formato. Eso sí, los artefactos se referencian entre sí no por hash, sino por identificadores estables: de lo contrario, editar un solo archivo cambiaría en cascada los hashes de toda la cadena; la correspondencia entre identificadores y hashes se guarda en el manifiesto de la compilación.
Qué se incluye en la compilación ya no se define marcando cada asset, sino mediante assets raíz, que son ScriptableObject corrientes. Las dependencias se arrastran automáticamente y se rastrean por asset individual, no por bundle. En el código aparece el tipo Loadable<T>
, una referencia cargable a nivel de motor: se declara un campo del tipo Loadable<Mesh> bodyMesh y después se llama a bodyMesh.Load(); los assets individuales pueden cargarse y descargarse de forma síncrona o asíncrona, con async/await. Los objetos a los que apunta un Loadable entran en la compilación, pero no se cargan en memoria hasta que se solicitan. La carga en sí es completamente asíncrona tanto en la lectura como en la deserialización, usando las API asíncronas de cada plataforma; en la base está el formato de archivos de contenido que apareció en DOTS en 2022.Qué hacer si ya estás con Addressables
Unity no ha roto los proyectos existentes. Los content directories son compatibles con el paquete Addressables, que sigue siendo la interfaz para organizar el contenido, y los proyectos existentes pueden convertirse al nuevo backend: Slime Rancher 2 se migró sin una sola modificación de código. El procedimiento de conversión y la comparación de las opciones están descritos en la documentación de Addressables.
Lo que cambia es el enfoque sobre qué hay que marcar siquiera. Unity incluye automáticamente en la compilación los assets referenciados por un Loadable y elimina por su cuenta los duplicados, así que ya no hacen falta bundles separados para las dependencias comunes. La documentación recomienda crear un único asset raíz para todo el proyecto y, si el código carga muchos assets mediante claves de texto, usar un ScriptableObject como lista de assets en lugar de multitud de raíces.
Limitaciones que conviene conocer de antemano
En la 6.6 los content directories solo funcionan con contenido local, el que viaja junto al player. Para la entrega remota y las descargas posteriores a la instalación siguen haciendo falta AssetBundles o un mecanismo propio. Unity promete una entrega granular «por el aire» completa en la generación Unity 7, con detalles en 2027.
- la API BuildUsage
Un content directory se registra en el runtime, tras lo cual sus assets quedan disponibles; las escenas también se enlazan mediante referencias cargables. Los detalles están descritos en la documentación oficial de Unity sobre content directories.
Por qué Unity ha necesitado cambiar los cimientos justo ahora
Los content directories parecen un cambio de apoyo de toda la pila de contenido más que una función suelta de la 6.6. Las limitaciones del AssetBundle se dejan ver también en el diseño de Addressables: una parte apreciable del trabajo con ese paquete se reducía a compensar la indivisibilidad del bundle. Si la unidad básica se vuelve atómica, parte de las tareas habituales de los artistas técnicos y los ingenieros de compilación —repartir por grupos, cazar duplicados, gestionar a mano las cadenas de dependencias— pierden sentido por sí solas.
La dirección coincide con el movimiento general de la industria hacia los almacenamientos direccionables por contenido y las compilaciones incrementales: el mismo principio lleva tiempo funcionando en los sistemas de control de versiones y en las cachés de compilación, y en los proyectos grandes rinde sobre todo en el tiempo de iteración. La reducción diez veces de la compilación incremental en el ejemplo de Slime Rancher 2 golpea no tanto a la build final como al ciclo diario de editar y comprobar, que es donde los equipos gastan sus horas de trabajo.
Addressables, por su parte, no desaparece: a juzgar por cómo está planteada la migración, el paquete sigue siendo la interfaz de usuario y los content directories ocupan el lugar de debajo. Teniendo en cuenta que Unity vincula la entrega remota a los nuevos cimientos en la generación Unity 7, el paso a este backend probablemente acabará siendo condición para la descarga granular de contenido, y a los proyectos que hoy viven del reparto manual de bundles les conviene estudiar la conversión con antelación.
¿Por qué se ha jubilado a los AssetBundles justo ahora: la presión de Godot y Unreal, el dolor acumulado de Addressables, un cambio de rumbo tras la salida de John Riccitiello?