原创

AssetBundle资源打包、加载与卸载

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dlhcoder/article/details/84027206

打AsssetBundle包的优点:方便更新(比如节假日游戏UI更新)、减小安装包大小


AssetBundle打包

首先选中要打包的对象,在Inspector面板最下端分别设置对象的AssetBundle名字,及AB包的后缀名(可选)
public class BuildAssetBundle : MonoBehaviour {
	//扩展Unity编辑器Tools/BuildAB
    [MenuItem("Tools/BuildAB")]
    public static void BuildAB()
    {
        //AsssetBundle包存放文件目录
        string dir = "Assets/AssetBundles";
        if(!Directory.Exists(dir))
        {
            //检查目录是否已经存在,若不存在创建该目录
            Directory.CreateDirectory(dir);
        }
        //打AB包,注意是BuildAssetBundles 复数的
        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
    }
}
打包函数中参数详解:

BuildPipeline.BuildAssetBundles (string path,BuildAssetBundleOptions options,BuildTarget target );
1、path路径,随意,只要存在即可
2、BuildAssetBundle.None 使用LZMA算法压缩,包更小,但需整体解压,加载时间长(下载是LZMA压缩,下载之后LZ算法保存在本地)
BuildAssetBundle.UncompressedAssetBundle 不压缩、包大,但加载速度最快
BuildAssetBundle.ChunkBasedCompression LZ4算法压缩,不需要整体解压,但包比较大
注:LZ4算法压缩,有不压缩的加载速度,而且比不压缩包要小
3、BuildTarget.xx 可根据需要选择Android或Windows等不同平台,但各平台之间的AB资源包不能通用)

打包策略

打AB包分组,根据自己项目需求,可分”逻辑“、”类型“、”使用(比如关卡等)“
经常更新的单独一包,不常更新的一包;共享资源单独一包;需同时加载的小资源一包等等


AssetBundle加载(四种方法)

新版UnityLoadFromCacheOrDownload被弃用,推荐UnityWebRequest

public class LoadAssetBundle : MonoBehaviour {

    public string path;
	// Use this for initialization
	void Start () {
        //注意被加载资源的路径准确性
        path = "Assets/AssetBundles/obj/sphere.unity3d";

        #region  第一种加载方法  LoadFromFile  (同步)
        //加载AB包
        AssetBundle ab = AssetBundle.LoadFromFile(path);
        //加载AB包中的资源, 注意资源的名称要和预制体的名称一致(大小写),不是AB包中的 
        GameObject sphere = ab.LoadAsset<GameObject>("Sphere");
        //加载AB包中的所有资源并遍历
        object[] objs = ab.LoadAllAssets();
        foreach(Object obj in objs)
        {
            Debug.Log(obj.name);
        }
        ////场景中实例化物体
        Instantiate(sphere);
        #endregion

        #region  第一种加载方法 LoadFromFileAsync  (异步)
        //StartCoroutine(LoadFile());
        #endregion

        #region  第二种加载资源的方法 LoadFromMemory 同步
        //同步的方式加载,会等资源加载完返回值
        AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
        GameObject sphere = ab.LoadAsset<GameObject>("Sphere");
        Instantiate(sphere);
        #endregion

        #region  第三种加载资源的方法  UnityWebRequest
        //StartCoroutine(WebRequest());
        #endregion

        #region  第四种加载资源的方法  LoadFromCacheOrDownload
        //StartCoroutine(LoadCacheOrDownload());
        #endregion
    }

    /// <summary>
    /// 第一种加载方法 LoadFromFileAsync 异步加载
    /// </summary>
    /// <returns></returns>
    IEnumerator LoadFile()
    {
        AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path);
        yield return request;
        AssetBundle ab = request.assetBundle;
        GameObject sphere = ab.LoadAsset<GameObject>("Sphere");
        //加载AB包中的所有资源并遍历
        object[] objs = ab.LoadAllAssets();
        foreach (Object obj in objs)
        {
            Debug.Log(obj.name);
        }
        Instantiate(sphere);
    }

    /// <summary>
    /// 第三种加载资源的方法  UnityWebRequest
    /// </summary>
    /// <returns></returns>
    IEnumerator WebRequest()
    {
        //注意DemoExe后面的斜杠“/”
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle("file://D:/Duanlihua/UnityProjects/DemoExe/" + path);
        yield return request.SendWebRequest();

        //方法一:加载ab包
        //AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
        //方法二: 加载ab包
        AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;

        GameObject sphere = ab.LoadAsset<GameObject>("Sphere");

        Object[] objs = ab.LoadAllAssets();
        foreach (Object obj in objs)
        {
            Debug.Log(obj.name);
        }

        Instantiate(sphere);
    }

    /// <summary>
    /// 第四种加载资源的方法  LoadFromCacheOrDownload
    /// </summary>
    /// <returns></returns>
    IEnumerator LoadCacheOrDownload()
    {
        //路径问题 @file//
        while (!Caching.ready)
        {
            yield return null;
        }
        //本地加载
        //WWW data = WWW.LoadFromCacheOrDownload("file://D:/Duanlihua/UnityProjects/DemoExe/"+path, 1);

        //服务器下载(本地搭建的TomCat服务器)
        WWW data = WWW.LoadFromCacheOrDownload("http://localhost:8080/"+path, 1);

        yield return data;

        if (!string.IsNullOrEmpty(data.error))
        {
            print(data.error);
            yield break;
        }

        AssetBundle ab = data.assetBundle;
        GameObject sphere = ab.LoadAsset<GameObject>("Sphere");

        //加载AB包中的所有资源并遍历
        object[] objs = ab.LoadAllAssets();
        foreach(Object obj in objs)
        {
            Debug.Log(obj.name);
        }

        Instantiate(sphere);
    } 
}

Manifest加载依赖

AssetBundle manifestAB= AssetBundle.LoadFromFile(manifestFilePath);
AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
//传递的是需要加载依赖的资源的名字
string[] dependencies = manifest.GetAllDependencies("assetBundle"); 

//遍历依赖,依次加载
foreach(string dependency in dependencies)
{	
	//assetBundlePath 路径是AssetBundle的根目录
    AssetBundle.LoadFromFile(Path.Combine(assetBundlePath, dependency));
}

AssetBundle卸载

  • AsssetBundle.Unload (true),为"True",表示卸载AB包内所有资源,即使仍有资源被使用
    (适用情况:1、在关卡切换或场景切换时调用;2、所有资源没有用时调用)
  • AssetBundle.Unload (false),为"False",表示卸载没有用的资源
    (剩余没有被卸载的资源怎么办呢? 1、使用Resources.UnloadUnusedAssets();2、场景切换时会自动卸载
文章最后发布于: 2018-11-14 13:04:46
展开阅读全文
0 个人打赏

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览