zoukankan      html  css  js  c++  java
  • AssetBundleNote

    AssetBundle自身保存依赖关系
    压缩包使用LZMA和LZ4压缩算法,减少包大小,更快进行网络传输

    BuildPipeline.BuildAssetBundles(输出路径,打包选项,打包平台);// buildAssetbundles.

    AssetBundle ab = AssetBundle.LoadFromFile("MyAssetBundles/wall.unity3d");
    GameObject go = ab.LoadAsset<GameObject>("Cube"); //这里也可以使用LoadAllAsset 获取所有, 然后在使用的时候需要遍历
    Instantiate(go);

    打包分组策略
    依赖打包, 公共资源单独打包

    BuildAssetBundleOPtions.None:LZMA压缩,包小,加载时间长,包中资源整体解压, 一旦被下载之后,会自动使用LZ4算法保存到本地 的机制
    BuildAssetBundleOptions.ChunkBasedCompression:LZ4压缩 压缩率没有LZMA高,但是可以加载指定资源而不用解压全部,并且加载速度比LZMA快
    BuildAssetBundleOPtions.UncompressedAssetBundle 不压缩 包大,加载块

    在使用有依赖关系的包,尽量在使用之前需要加载依赖的包; 如果一个材质球依赖一个贴图, 那么这个贴图的包什么时候被加载,这个材质球什么时候被赋予贴图


    加载方式
    1: 从一个二进制中读取
    AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes("MyAssetBundles/wall")); //异步方式,去掉Async为同步方式
    yield return request;
    AssetBundle ab = request.assetBundle;

    2: 从一个文件中读取(相当于自动转换二进制的LoadFromMemory) 与上边同样有异步同步方式加载
    AssetBundle.LoadFromFile;

    3. WWW www = WWW.LoadFromCacheOrDownload(@"file://G:UnityProjectlxAssetBundleMyAssetBundleswall",1);第二参数为版本号, 如果是新的版本号会从新下载
    yield return www;

    if (!string.IsNullOrEmpty(www.error))
    {
    print(www.error);
    }

    AssetBundle ab = www.assetBundle;
    GameObject go = ab.LoadAsset<GameObject>("Cube");
    Instantiate(go);

    4. UnityWebRequest: 即将替换LoadFromCacheOrDownload
    UnityWebRequest uwr = UnityWebRequest.GetAssetBundle(@"http://127.0.0.1:19876/MyAssetBundles/wall");

    yield return uwr.SendWebRequest();
    AssetBundle ab = DownloadHandlerAssetBundle.GetContent(uwr);

    UnityWebRequest 的另一种使用方法

    UnityWebRequest uwr = UnityWebRequest.GetAssetBundle(@"http://127.0.0.1:19876/MyAssetBundles/wall");

    yield return uwr.SendWebRequest();
    //下边不一样
    AssetBundle ab = (uwr.downloadHandler as DownloadHandlerAssetBundle).assetBundle

    to load a assets

    T objectFromBundle = bundleObject.LoadAsset<T>(assetName);

    to load allAssets

    Unity.Object[] objectArray = loadedAssetBundle.LoadAllAssets();

    获取依赖并加载

    UnityWebRequest manifest = UnityWebRequest.GetAssetBundle(@"http://127.0.0.1:19876/MyAssetBundles/MyAssetBundles"); //首先获取AssetBundle 用WWW也行fromFile也行

    yield return manifest.SendWebRequest(); //发送请求

    AssetBundle maniAb = DownloadHandlerAssetBundle.GetContent(manifest); //得到ab

    AssetBundleManifest abm = maniAb.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); //获取主Manifest

    string[] allDependencies = abm.GetAllDependencies("wall"); //获取wall的依赖包名

    foreach (string item in allDependencies) //遍历
    {
    UnityWebRequest dep = UnityWebRequest.GetAssetBundle(@"http://127.0.0.1:19876/MyAssetBundles/" + item);
    yield return dep.SendWebRequest();
    AssetBundle ab1 = DownloadHandlerAssetBundle.GetContent(dep);

    }

    AssetBundle ab = DownloadHandlerAssetBundle.GetContent(uwr);



    释放ab
    AssetBundle.UnLoad(bool value) true: 不管有没有其他物体引用,直接卸载(释放). false:如果有使用的,那么这个资源不会被释放
    释放过后 不管参数是true还是false , 这个资源都没有任何引用关系了. 即使再次加载进来这个资源, 那么(比如说材质) 也不会被指定到物体上

    这里有个问题就是如果参数是false的话 那么只会卸载ab包的对象, 资源并没有卸载, 会导致内存泄露 所以尽量保证资源不适用后使用true的参数进行卸载


    如果一定要使用false 两种方法解决 1.可以再后边确定物体和代码都没有引用的时候使用Resources.UnloadUnusedAssets(); 方法进行卸载
    2.场景切换的时候会自动调用上边的方法

    CRC MD5 SHA1 加密/校验

    UGUI打包问题

    UGUI中会自动将图片资源打包到一个图集中,如果两个包引用了两个不同的图片,那么会导致每个包中都包含一个图集
    解决办法. 在图片资源中有Packing Tag ,可以将一些依赖的图片设置为一个标签, 这样UGUI打包的时候就会放到一起了


    AssetBundle Browser Tool

    本博客所有内容均为原创,转载请注明出处.
  • 相关阅读:
    如何把py文件打包成exe可执行文件
    给大家推荐几款软件
    火狐浏览器报错“support.mozilla.org
    win怎么设置最快捷的下滑关机
    在Ubuntu上安装Chrome Driver和Firefox Driver
    解决pycharm安装包过程出现的问题:module 'pip' has no attribute 'main'
    如何实现windows命令提示符的tab补全?
    在windows下使用cmd命令全速下载百度云文件
    pandas用法大全
    oracle 19c database 静默安装
  • 原文地址:https://www.cnblogs.com/what-lee/p/9125756.html
Copyright © 2011-2022 走看看