Precauciones para empaquetar y cargar con AssetBundle en Unity

1. Use AssetBundle para empaquetar y cargar
Personalmente, creo que puede consultar los siguientes dos blogs. Hay muchos tutoriales relacionados en Internet. Si no entiende, puede ir a Baidu o dejar un mensaje.
Unity empaqueta y carga AssetBundle (cargando las dependencias correspondientes)
AssetBundle en Unity
2. Precauciones al usar AssetBundle para cargar:
Nota 1: El nombre de AssetBundle y el prefabricado que establece el nombre de AssetBundle debe ser el mismo que el del método de código C# Los parámetros corresponden uno a uno.
Si no corresponde, se informará este error en la consola de Unity: ArgumentException: el objeto que desea instanciar es nulo.
inserte la descripción de la imagen aquí

1. Este es el prefabricado que quiero empaquetar.
inserte la descripción de la imagen aquí
Se puede ver que el nombre del AssetBundle correspondiente al prefabricado de TestCapsule está establecido en test_1
2. Utilizo el Navegador AssetBundle, un complemento oficial de administración de paquetes AB proporcionado por Unity, para empaquetar. Los lectores pueden usar scripts personalizados para empaquetar.Personalmente, creo que esta forma de empaquetar complementos es muy útil.
inserte la descripción de la imagen aquí
Después de hacer clic en el botón Crear, se generará una carpeta StreamingAssets en la carpeta Activos del proyecto. Dentro de la carpeta StreamingAssets se encuentra el archivo AssetBundle escrito.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Después de hacer clic en el botón Generar, hay una carpeta de AssetBundles en el mismo nivel de directorio que la carpeta de Activos del proyecto, y el archivo de AssetBundle también se escribe en esta carpeta de AssetBundles.
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Nota: El contenido del archivo AssetBundle en la carpeta StreamingAssets y la carpeta AssetBundles es el mismo.

3. Utilice el código C# para cargar el paquete de recursos AssetBundle (carga de ruta relativa local).

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class TestABLoad : MonoBehaviour
{
    
    
    void Start()
    {
    
    
        AssetBundle ab = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "test_1"));
        GameObject cube = ab.LoadAsset("TestCapsule") as GameObject;//LoadAsset方法中参数为导出前Prefab名字
        Instantiate(cube);//生成
    }
}

Cabe señalar aquí que el parámetro en el método AssetBundle.LoadFromFile es la ruta del archivo AssetBundle que se escribe.
inserte la descripción de la imagen aquí
Es decir, en el directorio StreamingAssets bajo el directorio Assets, es decir, el nombre completo del archivo test_1 (si hay sufijo, debe incluir el sufijo, y si no hay sufijo, no se puede incluir).
inserte la descripción de la imagen aquí
Además, los parámetros en el método LoadAsset en la figura a continuación deben ser consistentes con el nombre de la casa prefabricada que establece el nombre de archivo de AssetBundle test_1.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
4. Después de guardar la secuencia de comandos, vuelva a Unity y monte la secuencia de comandos TestABLoad en cualquier objeto del juego.Después de ejecutar el juego, puede ver que los recursos del juego correspondientes al paquete de recursos test_1 están cargados.
inserte la descripción de la imagen aquí
Nota 2: use el código C# para cargar la ruta absoluta local del paquete de recursos AssetBundle
1. Como se mencionó anteriormente, hay una carpeta AssetBundles en el mismo nivel que la carpeta Assets del proyecto, y el archivo AssetBundle también se escribe en la carpeta AssetBundles . El contenido del archivo AssetBundle en la carpeta StreamingAssets y la carpeta AssetBundles es el mismo. Entonces, también puede usar el archivo AssetBundles en la carpeta AssetBundles para cargar.
inserte la descripción de la imagen aquí
Se puede ver que esta carpeta no está en el directorio de Activos del proyecto, así que use una ruta absoluta para cargarla.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class TestABLoad : MonoBehaviour
{
    
    
    void Start()
    {
    
    
        var myLoadedAssetBundle = AssetBundle.LoadFromFile("G:\\C++ Open Sources Project\\NoahGameFrameClient\\UnityDemo\\AssetBundles\\StreamingAssets\\test_1");
        if (myLoadedAssetBundle == null)
        {
    
    
            Debug.Log("Failed to load AssetBundle!");
            return;
        }
        var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("TestCapsule");
        Instantiate(prefab);
    }
}

2. Después de guardar el script, vuelva a Unity y monte el script TestABLoad en cualquier objeto del juego. Después de ejecutar el juego, puede ver que los recursos del juego correspondientes al paquete de recursos test_1 están cargados.
inserte la descripción de la imagen aquí
3. Pero hice una pequeña prueba. Monté este script TestABLoad en un objeto de juego en otra escena de proyecto de Unity en mi área local. Después de ejecutar el juego, los recursos correspondientes no se cargaron y se informó un error. Entonces, se puede ver que el archivo AssetBundles escrito por el proyecto X solo puede ser usado por el proyecto X, y no se pueden usar otros proyectos.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Nota 3: Comparación de tres métodos de compresión:
NoCompression: sin compresión, descompresión rápida, paquete grande, no recomendado.
LZMA: compresión mínima, descompresión lenta, use un recurso para descomprimir todos los recursos del paquete.
LZ4: compresión ligeramente mayor, descompresión rápida, qué usar para la descompresión, bajo uso de memoria, generalmente se recomienda usar esto.

1. Tome como ejemplo el prefab que quiero empaquetar, se puede ver que el archivo del prefab ocupa 3KB .
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
2. Cuando elijo NoCompression para no comprimir, la descompresión es rápida y el paquete es grande. Este método no es recomendable y lo empaqueto . Se puede ver que el archivo empaquetado ocupa 138 KB .
Por favor agregue una descripción de la imagen

Por favor agregue una descripción de la imagen
3. Cuando elijo LZMA: compresión mínima, descompresión lenta y uso de un recurso para descomprimir todos los recursos del paquete y empaquetarlo, se puede ver que el archivo empaquetado ocupa 28 KB .
Por favor agregue una descripción de la imagen
Por favor agregue una descripción de la imagen
4. Cuando elijo LZ4: compresión un poco más grande, descompresión más rápida, qué usar para la descompresión, bajo uso de memoria, generalmente se recomienda usar este método para empaquetar, se puede ver que el archivo empaquetado ocupa 45 KB .
Por favor agregue una descripción de la imagen
Por favor agregue una descripción de la imagen
Nota 4: elimine el prefabricado TestCapsule correspondiente al paquete de recursos de AssetBundle test_1, y el prefabricado TestCapsule se puede cargar normalmente después de que se ejecute el proyecto.
1. Este es el prefabricado TestCapsule correspondiente al paquete de recursos AssetBundle test_1.
inserte la descripción de la imagen aquí
2. Elimine el prefabricado TestCapsule del proyecto actual.
inserte la descripción de la imagen aquí
3. Monte la secuencia de comandos TestABLoad de ruta relativa o ruta absoluta anterior en un determinado objeto del juego en la escena.Después de ejecutar el juego, puede ver que el recurso del juego correspondiente al paquete de recursos test_1 está cargado.

inserte la descripción de la imagen aquí
Esto se carga usando una ruta absoluta local.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class TestABLoad : MonoBehaviour
{
    
    
    void Start()
    {
    
    
        var myLoadedAssetBundle = AssetBundle.LoadFromFile("G:\\C++ Open Sources Project\\NoahGameFrameClient\\UnityDemo\\AssetBundles\\StreamingAssets\\test_1");
        if (myLoadedAssetBundle == null)
        {
    
    
            Debug.Log("Failed to load AssetBundle!");
            return;
        }
        var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("TestCapsule");
        Instantiate(prefab);
    }
}

A continuación, usamos la ruta relativa local para cargar Después de ejecutar el juego, puede ver que los recursos del juego correspondientes al paquete de recursos test_1 están cargados.
inserte la descripción de la imagen aquí

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class TestABLoad : MonoBehaviour
{
    
    
    void Start()
    {
    
    
        AssetBundle ab = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "test_1"));
        GameObject cube = ab.LoadAsset("TestCapsule") as GameObject;//LoadAsset方法中参数为导出前Prefab名字
        Instantiate(cube);//生成
    }
}

De lo anterior se puede ver que la carga de recursos no depende de la TestCapsule prefabricada correspondiente al paquete de recursos de AssetBundle test_1, sino que depende del paquete de recursos de AssetBundle correspondiente test_1.

Supongo que te gusta

Origin blog.csdn.net/jianjianshini/article/details/129467281
Recomendado
Clasificación