En algunas situaciones, es útil hacer que un asset sea disponible a un proyecto sin necesidad de cargarlo como parte de una escena. Por ejemplo, puede haber un personaje u otros objetos que aparezcan en cualquier escena del juego pero que serán utilizadas infrecuentemente (esto podría ser una característica “secreta”, un mensaje de error o una alerta de un puntaje máximo, digamos). Adicionalmente, usted podría incluso querer cargar los assets de un archivo separado o URL para reducir el tiempo de descarga inicial o permitir el intercambio de contenido de juegos.
Unity soporta Resource Folders en el proyecto para permitir que el contenido sea suministrado en el archivo principal del juego, pero no ser cargado hasta que sea solicitado. Usted puede también crear Asset Bundles. Estos son archivos completamente separados de un archivo del juego principal que contiene assets en ser accedidos por el juego en demanda de un archivo o URL.
Un Asset Bundle es una colección externa de assets. Usted puede tener muchos Asset Bundles y por lo tanto tener diferentes colecciones externas de assets. Estos archivos existen afuera del reproductor de Unity construido, usualmente sentando en un servidor web para que los usuarios finales sean accedidos de manera dinámica.
Para construir un Asset Bundle, usted llama BuildPipeline.BuildAssetBundles() desde adentro de un script del editor. En los argumentos, usted especifica un arreglo de Objects en ser incluidos en el archivo construido, en conjunto con otras opciones. Esto va a construir un archivo el cual usted puede cargar luego de manera dinámica en el tiempo de ejecución al utilizar AssetBundle.LoadAsset().
La carpeta de recursos son colecciones de assets que son incluidos en el reproductor de Unity construido, pero no son necesariamente enlazados a cualquier GameObject en el inspector.
Para colocar cualquier cosa en una Resource Folder (Carpeta de recursos), usted puede simplemente crear una nueva carpeta dentro del Project View, y nombrar la carpeta “Resources”. Usted puede tener múltiples Resource Folders organizadas diferentemente en su proyecto. Cuando sea que usted quiera cargar un asset de una de estas carpetas, usted puede llamar Resources.Load().
Si su destino de implementación es Streaming Web Player, usted puede definir qué escena va a incluir todo en sus Resource Folders (Carpetas de Recursos). Usted puede hacer esto en los Player Settings, accesibles vías Edit->Project Settings->Player, la cola de stream es determinada por el orden de escena de las Build Settings (Ajustes de Construcción)
Todos los assets encontrados en las carpetas Resources y sus dependencias son almacenados en un archivo llamado resources.assets. Si un asset ya está en uso por otro nivel es almacenado en el archivo .sharedAssets para ese nivel. Los ajustes de los Edit -> PlayerSettings First Streamed Level determinan el nivel al cual los resources.assets serán coleccionados e incluidos en la construcción.
Si un nivel anterior al “First streamed Level” está incluyendo un asset en una carpeta Resource, el asset será almacenado en los assets para ese nivel. si es incluidos después, el nivel va a referenciar el asset del archivo “resources.assets”.
Solamente los assets que están almacenados en la Resources folder pueden ser accedidos a través de Resources.Load(). Sin embargo, hay más assets que podrían terminar en el archivo “resources.assets” ya que son dependencias. (Por ejemplo un Material en la carpeta Resources podría referenciar una Textura afuera de la carpeta Resources)
Usted puede descargar recursos de un AssetBundle al llamar AssetBundle.Unload(). Si usted pasa true para el parámetro unloadAllLoadedObjects, ambos el objeto mantenido internamente por el AssetBundle y los cargados del AssetBundle utilizando AssetBundle.LoadAsset()](../ScriptReference/AssetBundle.LoadAsset.html) será destruido y la memoria utilizado por el bundle será soltada.
A veces usted puede preferir cargar un AssetBundle, instanciar los objetos deseados y soltar la memoria utilizada por el bundle mientras mantiene los objetos alrededor. El beneficio es que usted libra memoria para otras tareas, por ejemplo, cargar otro AssetBundle. En este escenario usted podría pasar false como el parámetro. Después de que el bundle es destruido usted no será capaz de cargar los objetos de este no más.
Si usted quiere destruir objetos de escena cargados utilizando Resources.Load() antes de que cargar otro nivel, llame Object.Destroy() en estos. Para soltar los assets, utilice Resources.UnloadUnusedAssets().