Notas del paquete de activos de Unity

 Recursos de aprendizaje  https://www.bilibili.com/video/BV1Et411Z76x?p=11

Embalaje de paquetes de activos

 

Hay dos recursos que deben empaquetarse, uno prefabricado y otro material. Prefabricado se refiere al material.

 

Dos funciones, eliminar la carpeta AssetBundles y empaquetar sin eliminar el contenido de AssetBundles. Si empaqueta dos veces, tendrá el mismo contenido el doble.

/*
 * Author : 
 * Time   : 2020.5
 * Title  : 
 * Description:
 * 
 * 
 */
using System.IO;
using UnityEditor;
using UnityEngine;
static class BuildAssetBundles
{
    /// <summary>
    /// 在AssetBundles(和Asset同级)下创建所有ab包
    /// </summary>
    [MenuItem("Assets/Build AssetBundles(Dont Delete Exist AssetBundles)")]
    static void Build()
    {
        if (!Directory.Exists("AssetBundles"))
            Directory.CreateDirectory("AssetBundles");

        BuildPipeline.BuildAssetBundles("AssetBundles", 
            BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64);
    }
    /// <summary>
    /// 删除AssetBundles文件下的所有东西(包括该文件夹)
    /// </summary>
    [MenuItem("Assets/Delete All AssetBundles")]
    static void DeleteAll()
    {
        Delete("AssetBundles");
    }
    /// <summary>
    /// 删除路径下的所有文件夹,包括该文件夹
    /// </summary>
    /// <param name="path"></param>
    static void Delete(string path)
    {
        DirectoryInfo dir = new DirectoryInfo(path);
        FileSystemInfo[] files = dir.GetFileSystemInfos();

        //因为是文件信息集合不是文件集合所以可以用foreach迭代
        foreach (var file in files)
        {
            if (file is DirectoryInfo)
                Delete(file.FullName);
            else
                file.Delete();
        }
        dir.Delete();

    }

    
}

Paquetes de activos empaquetados

Puedes ver que el paquete de pared es muy pequeño, esto se debe a que el material al que hace referencia el Cubo también está empaquetado. Si solo se empaqueta el cubo, dos cubos tendrán el tamaño de dos copias del material.

Los dos últimos parámetros del método son el método de empaquetado y compresión y la plataforma de empaquetado.

 

 

UnityWebRequest carga AssetBundles locales y de servidor

UnityWebRequest carga recursos locales y del servidor. El servidor usa Tomcat. Cree una carpeta Unity en la aplicación web de la carpeta Tomcat y copie la carpeta AssetBundles generada por el código anterior.

 

La pared depende del material.

Si no carga (GetContent) los recursos en el paquete dependiente, el material no se puede mostrar normalmente, independientemente del orden de carga.

/*
 * Author : 
 * Time   : 2020.5
 * Title  : 
 * Description:
 * 
 * 
 */
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class Example : MonoBehaviour
{
    private void Start()
    {
        //AssetBundle wallAB = AssetBundle.LoadFromFile("AssetBundles/wall.unity3d");
        //AssetBundle materialAB = AssetBundle.LoadFromFile("AssetBundles/material.unity3d");

        //GameObject prefab = wallAB.LoadAsset<GameObject>("Cube");
        //Instantiate(prefab);
        print(Application.dataPath);
        string path = @"D:/Documents/Unity/Project/TestProject/AssetBundles/";
        string url = "localhost:8080/Unity/AssetBundles/";
        StartCoroutine(LoadCoroutine(url));
    }

    IEnumerator LoadCoroutine(string path)
    {
        print("begin");
        UnityWebRequest wallRequest = UnityWebRequestAssetBundle.GetAssetBundle(path + "wall.unity3d");
        UnityWebRequest shareRequest = UnityWebRequestAssetBundle.GetAssetBundle(path + "material.unity3d");
        wallRequest.timeout = 10;
        shareRequest.timeout = 10;

        yield return wallRequest.SendWebRequest();
        print("down1");
        yield return shareRequest.SendWebRequest();
        print("down2");

        //如果不获取依赖包,则无法正常加载
        DownloadHandlerAssetBundle.GetContent(shareRequest);
        AssetBundle wallAB = DownloadHandlerAssetBundle.GetContent(wallRequest);

        GameObject wallPrefab = wallAB.LoadAsset<GameObject>("Cube");
        Instantiate(wallPrefab);
    }

}

También es posible escribir así: crear una instancia primero y luego cargar el material. El material se cargará después de dos segundos.

 

Obtenga el manifiesto y obtenga la información de dependencia del paquete ab

 

    void LoadLocally()
    {
        AssetBundle wallAB = AssetBundle.LoadFromFile(@"AssetBundles/wall.unity3d");
        AssetBundle mainAB = AssetBundle.LoadFromFile(@"AssetBundles/AssetBundles");
        AssetBundleManifest manifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

        string[] wallABDependencies = manifest.GetAllDependencies("wall.unity3d");
        foreach (var s in wallABDependencies)
        {
            AssetBundle.LoadFromFile(@"AssetBundles/" + s);
        }

        GameObject prefab = wallAB.LoadAsset<GameObject>("Cube");
        Instantiate(prefab);
    }

No necesita saber el nombre ab del material requerido por Cube para cargarlo.

Se confirman los nombres de mainAB y manifest anteriores.

Supongo que te gusta

Origin blog.csdn.net/qq_41225779/article/details/106153921
Recomendado
Clasificación