Uso del paquete de activos en Unity

Unity tiene muchas funciones útiles, una de ellas es la compatibilidad con paquetes de activos.

¿Qué son los paquetes de activos?

Los paquetes de recursos son archivos que contienen recursos del juego, desde recursos simples como modelos 3D, texturas y clips de audio, hasta otros más complejos, como Escenas y Prefabricados.

Sin embargo, los scripts no se pueden incluir en los paquetes de activos, solo sus referencias, así que tenga cuidado al cambiarles el nombre o moverlos, ya que se interrumpirá la conexión y deberá reconstruir los paquetes de activos para que funcionen nuevamente.

¿Cuándo usar paquetes de activos?

Usa Paquetes de activos cuando tu juego tenga muchos activos e incluirlos en la compilación afecte el tiempo de descarga inicial.

Exportación de paquetes de activos

La exportación de paquetes de activos se realiza en dos pasos: asignar nombres de paquetes de activos y construirlos usando el editor script.

Asignación de nombres de paquetes de activos

Para asignar el nombre del paquete de activos, seleccione el activo en la vista Proyecto (puede ser Prefabricado, Textura o incluso una Escena), luego en la vista Inspector en la parte inferior, haga clic en el menú desplegable, luego haga clic en 'New...' (o haga clic en el nombre del paquete de activos existente).

Asignar el mismo nombre de paquete a varios activos los empaquetará en el mismo paquete de activos. Se recomienda empaquetar Escenas por separado del resto de los activos.

Además, no tiene que asignar un nombre de paquete de activos a cada activo. Por lo general, solo necesita asignar el nombre del paquete a la casa prefabricada o activo principal, el resto de las dependencias se incluirán automáticamente.

Paquetes de activos de construcción

Para crear paquetes de activos, siga los pasos a continuación:

  • Cree una nueva carpeta llamada Editor (si no tiene ninguno)
  • Cree un nuevo script dentro de la carpeta Editor, asígnele el nombre BuildAssetBundles y luego pegue el siguiente código dentro:

BuildAssetBundles.cs

using UnityEngine;
using UnityEditor;

public class BuildAssetBundles
{
    [MenuItem("Build/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string outputFolder = "Assets/__Bundles";

        //Check if __Bundles folder exist
        if (!AssetDatabase.IsValidFolder(outputFolder))
        {
            Debug.Log("Folder '__Bundles' does not exist, creating new folder");

            AssetDatabase.CreateFolder("Assets", "__Bundles");
        }

        BuildPipeline.BuildAssetBundles(outputFolder, BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget);
    }
}

Después de guardarlo, notará que agregará un botón de menú (Crear -> Crear AssetBundles). Al hacer clic en él, se crearán los paquetes de recursos y se colocarán en la carpeta "__Bundles".

Cargando paquetes de activos

Para cargar el paquete de activos, primero debe descargarse usando UnityWebRequest y luego descomprimirlo usando una función especial. En general, hay 2 tipos de paquetes de recursos, los que contienen recursos y los que contienen escenas.

Carga de activos desde los paquetes de activos

El siguiente código descarga el paquete de activos llamado "fpsplayer", luego extrae el prefabricado llamado "FPSPlayer" y lo instancia en la escena:

        int assetBundleVersion = 1; // Changing this number will force Asset Bundle reload
        string assetBundlePath = "file://" + Application.dataPath + "/__Bundles/" + "fpsplayer"; // Path to Asset Bundle file
        using (UnityEngine.Networking.UnityWebRequest www = UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(assetBundlePath, (uint)assetBundleVersion, 0))
        {
            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
            {
                Debug.LogError("AssetBundle Error: " + www.error);
                yield return null;
            }
            else
            {
                // Get downloaded Asset Bundle
                AssetBundle assetBundle = UnityEngine.Networking.DownloadHandlerAssetBundle.GetContent(www);
                // Extract Prefab named "FPSPlayer" from the Asset Bundle
                GameObject playerPrefab = assetBundle.LoadAsset("FPSPlayer") as GameObject;
                // Instantiate Player Prefab
                Instantiate(playerPrefab, Vector3.zero, Quaternion.identity);
                // Unload Asset Bundle from memory (but do not destroy the existing instance(s))
                assetBundle.Unload(false);
            }
        }

Cargar escenas desde los paquetes de activos

La carga de escenas desde el paquete de activos se realiza de forma ligeramente diferente.

El siguiente código descargará el paquete de activos con una escena y lo pondrá a disposición para su carga:

        int assetBundleVersion = 1; // Changing this number will force Asset Bundle reload
        string assetBundlePath = "file://" + Application.dataPath + "/__Bundles/" + "testscene"; // Path to Asset Bundle file
        using (UnityEngine.Networking.UnityWebRequest www = UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(assetBundlePath, (uint)assetBundleVersion, 0))
        {
            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
            {
                Debug.LogError("AssetBundle Error: " + www.error);
                yield return null;
            }
            else
            {
                // Get downloaded Asset Bundle (This will make the Scene available for load)
                AssetBundle assetBundle = UnityEngine.Networking.DownloadHandlerAssetBundle.GetContent(www);
                // Load the Scene extracted from the Asset Bundle
                UnityEngine.SceneManagement.SceneManager.LoadScene("TestScene");
            }
        }