• AssetBundle笔记


    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: 即将替换WWW
    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

    本博客所有内容均为原创,转载请注明出处.
  • 相关阅读:
    ATA/SATA/SCSI/SAS/FC总线简介
    RAID卡
    解读Gartner《2015年度新兴技术成熟度曲线报告》
    linux 下 取进程占用内存(MEM)最高的前10个进程
    网站用域名能访问,用域名IP不能访问的原因分析
    iis7下iis安全狗不能用怎么办(安装iis6兼容性)
    4M宽带一般最大的下载速度是多少?
    U盘安装操作系统
    windows7实现打印机共享的方法
    windows7系统下如何安装windows xp系统(无法识别硬盘,删除隐藏分区)
  • 原文地址:https://www.cnblogs.com/what-lee/p/9249876.html
Copyright © 2020-2023  润新知