Tutorial variante (Varient) de AssetBundle en Unity

prefacio

En el proceso de usar AssetBundle de Unity, después de seleccionar el objeto de recurso, descubrí que en el panel de AssetBundle en la esquina inferior derecha, además de una etiqueta de nombre, también hay una etiqueta Varient. Este artículo presenta principalmente el uso de esta etiqueta , como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí

Ejemplo de uso:

  • Multilingüe : En el proceso de desarrollo de juegos, te encontrarás con problemas multilingües, especialmente la globalización de los juegos que se está fomentando actualmente, por lo que es imprescindible soportar múltiples idiomas.
  • Modelos aplicables : para dispositivos móviles de diferentes grados, se requieren diferentes recursos, como la cantidad de caras del modelo, la simplicidad del sombreador, etc., y se requieren diferentes recursos.

La versión de Unity que uso aquí es 2019.4.4, y uso el complemento de administración de paquetes AB AssetBundle Browser. Este complemento se puede encontrar e instalar directamente en Windows -> Administrador de paquetes. Aquí, tomaré varios idiomas como un ejemplo para hacer una demostración sencilla.
Primero, cree una nueva carpeta en el directorio de activos para colocar los recursos del paquete AB. Siempre que la carpeta no se llame Resources (Resouces es la ruta de prevención de recursos predeterminada de Unity, se empaquetarán juntos al empaquetarlos y se empaquetarán juntos cuando se usan los recursos. Se cargan en la memoria, lo que hace que la memoria aumente), como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí
los recursos correspondientes a los prefabricados de la interfaz de usuario en chino e inglés se colocan debajo de las dos carpetas de muestra; luego, seleccione los recursos correspondientes y configure el paquete de activos en la posición del paquete de activos del nombre del panel Inspector y la variante del paquete de activos, la siguiente figura es un diagrama esquemático de la configuración de la misma interfaz de usuario en chino e inglés, respectivamente:

Configuración de los recursos de la interfaz de usuario en chino

inserte la descripción de la imagen aquí

Configuración de recursos de la interfaz de usuario en inglés

inserte la descripción de la imagen aquí
Después de eso, seleccione Windows->AssetBundle Browser en la barra de menú, abra la interfaz de configuración y seleccione la columna Build:
inserte la descripción de la imagen aquí
después de que el empaquetado sea exitoso, el recurso AB correspondiente se generará en el directorio StreamingAssets:
inserte la descripción de la imagen aquí
luego podemos verificar el efecto de carga en el guión, en pocas palabras, es Realice el cambio de varios idiomas

Código de muestra

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

public class ABLoadTest : MonoBehaviour
{
    
    
    private Dictionary<string, AssetBundle> abCache;
    private AssetBundle mainAB = null; //主包
    private AssetBundleManifest mainManifest = null; //主包中配置文件---用以获取依赖包
    private string language;
    GameObject cur_panel;
    AssetBundle ab;


    private string basePath
    {
    
    
        get
        {
    
    
#if UNITY_EDITOR || UNITY_STANDALONE
            return Application.dataPath + "/StreamingAssets/";
#elif UNITY_IPHONE
                return Application.dataPath + "/Raw/";
#elif UNITY_ANDROID
                return Application.dataPath + "!/assets/";
#endif
        }
    }

    string curabName
    {
    
    
        get {
    
     return "ui1." + language; }
    }

    void Start()
    {
    
    
        language = "en";
        abCache = new Dictionary<string, AssetBundle>();

        ab = LoadABTest();
        GameObject model = ab.LoadAsset<GameObject>("Canvas");
        cur_panel = Instantiate<GameObject>(model);
        // dosomething


    }

    AssetBundle LoadABTest()
    {
    
    
        string abName = curabName;
        if (mainAB == null)
        {
    
    
            mainAB = AssetBundle.LoadFromFile(basePath + "StandaloneWindows");
            mainManifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

        }
        //根据manifest获取所有依赖包的名称 固定API
        string[] dependencies = mainManifest.GetAllDependencies(abName);
        //循环加载所有依赖包
        for (int i = 0; i < dependencies.Length; i++)
        {
    
    
            //如果不在缓存则加入
            if (!abCache.ContainsKey(dependencies[i]))
            {
    
    
                //根据依赖包名称进行加载
                ab = AssetBundle.LoadFromFile(basePath + dependencies[i]);
                //注意添加进缓存 防止重复加载AB包
                abCache.Add(dependencies[i], ab);
            }
        }
        //加载目标包 -- 同理注意缓存问题
        if (abCache.ContainsKey(abName))
        {
    
    
            Debug.Log($"have load {
      
      abName}");
            return abCache[abName];
        }
        else
        {
    
    
            ab = AssetBundle.LoadFromFile(basePath + abName);
            abCache.Add(abName, ab);
            Debug.Log($"new load {
      
      abName}");
            return ab;
        }
    }

    // Update is called once per frame
    void Update()
    {
    
    
        if(Input.GetKeyDown(KeyCode.A)) // 同步加载
        {
    
    
            if(language != "zh")
            {
    
    
                if (cur_panel != null)
                {
    
    
                    cur_panel.SetActive(false);
                    Destroy(cur_panel);
                }
                UnLoad(curabName);
                language = "zh";
                ab = LoadABTest();
                GameObject model = ab.LoadAsset<GameObject>("Canvas");
                cur_panel = Instantiate<GameObject>(model);
            }

        }
            
        else if (Input.GetKeyDown(KeyCode.S))// 异步加载
        {
    
    
            if (language != "en")
            {
    
    
                if (cur_panel != null)
                {
    
    
                    cur_panel.SetActive(false);
                    Destroy(cur_panel);
                }
                UnLoad(curabName);
                language = "en";
                ab = LoadABTest();
                GameObject model = ab.LoadAsset<GameObject>("Canvas");
                cur_panel = Instantiate<GameObject>(model);
            }

        }
        else if (Input.GetKeyDown(KeyCode.D))// 单个卸载
        {
    
    
            string abName = "testuipanel0." + language;
            UnLoad(abName);
            Debug.Log("have UnLoadAll 3dmodel.first");

        }
        else if (Input.GetKeyDown(KeyCode.F))// 全部卸载
        {
    
    
            UnLoadAll();
            Debug.Log("have UnLoadAll");
        }

    }

    private IEnumerator LoadResAsyncTest(AssetBundle ab)
    {
    
    
        if (ab == null) yield return null;
        string abName = "testuipanel0." + language;
        var model1 = ab.LoadAssetAsync<GameObject>(abName);
        yield return model1;
        var cur_panel = Instantiate((GameObject)model1.asset);
        // dosomething
    }

    //====================AB包的两种卸载方式=================
    //单个包卸载
    public void UnLoad(string abName)
    {
    
    
        if (abCache.ContainsKey(abName))
        {
    
    
            abCache[abName].Unload(false);
            //注意缓存需一并移除
            abCache.Remove(abName);
        }
    }

    //所有包卸载
    public void UnLoadAll()
    {
    
    
        AssetBundle.UnloadAllAssetBundles(false);
        //注意清空缓存
        abCache.Clear();
        mainAB = null;
        mainManifest = null;
    }

}

Cambio de interfaz multilingüe a través de botones

:
inserte la descripción de la imagen aquí
Para el uso básico del paquete AB, puede leer este artículo

Supongo que te gusta

Origin blog.csdn.net/qq_41841073/article/details/127722505
Recomendado
Clasificación