• Unity之AssetBundle打包


    AssetBundle

    Resources:表示U3D自动将资源打成一个AssetBundle包,所有放在Resources下的文件夹都会打成一个AssetBundle包,资源非常大,Resources文件夹在真机上最大只有2G的内存(专业版会增大内存)

    AssetBundle包:其实可以看成一个压缩包(有固定格式的),默认情况下使用LZMA压缩方式压缩的资源文件;和压缩ZIP一样的,只不过里面的格式变了

       Unity3D引擎为我们提供了三种压缩策略来处理AssetBundle的压缩,即:

        1、LZMA格式:

            在默认情况下,打包生成的AssetBundle都会被压缩。在U3D中,AssetBundle的标准压缩格式便是LZMA(LZMA是一种序列化流文件),因此在默认情况下,打出的AssetBundle包处于LZMA格式的压缩状态,在使用AssetBundle前需要先解压缩。使用LZMA格式压缩的AssetBundle的包体积最小(高压缩比),但是会相应的增加解压缩的时间

        2、LZ4格式:

            Unity5.3之后的版本增加了LZ4格式压缩,由于LZ4的压缩比一般,因此经过压缩后的AssetBundle包体的体积较大(该算法基于chunk)。

        3、不压缩

    Resources和AssetBundle的区别:

      1、Resources:有2G的限制,不支持动态更新(拿Android为例)

        a、上线后,Resources里面的资源都在APK里面,只能读不能写

        b、StreamingAssets和dataPath都是在Apk中,Apk为一个压缩包,里面的东西只能读不能写,因此这个限制就决定了Resources不能支持热更新

      2、PersistPath(支持热更):

        a、只能手动打包

        b、打包方式:

          1、4.0以前,打包的依赖关系都必须手动

          2、5.0以后,这种依赖关系全部自动

    创建AssetBundle:AssetBundle可以将任何资源打包成assetbundle(如果是unity不能识别的文件,可以通过改变后缀进行打包)

      1、在任何一个游戏物体的右下角有AssetBundle,第一个为包名,第二个为后缀(不能识别的物体不能修改,修改后缀变成能识别的物体)

    更新流程:

      1、代码的更新:热更新

      2、资源的更新:AssetBundle更新

        a、创建assetbundle

        b、将assetbundle打成一个zip文件,放进streamingAssetPath里面

        c、把需要更新的AssetBundle先上传到Server,如果Server有更新(与服务器版本进行比对),把server的assetbundle包下载下来(zip文件),然后解压到persistentPath里

        d:加载:判断PersistentPath里是否有这个资源,如果没有就读取StreamingAssetPath里面的,如果有,就直接读取PersistentPath里的

            1、LoadAsset:从资源包中加载指定的资源

            2、LoadAllAsset:加载当前资源包中所以的资源

            3、LoadAssetAsync:从资源包中异步加载资源

      3、资源卸载:资源卸载部分使用的是Unload方法

         Unload:

            a、该方法会卸载运行时内存中包含在bundle中的所有资源。

            b、当传入的参数为true,则不仅仅内存中的AssetBundle对象包含的资源会被销毁;根据这些资源实例化而来的游戏内的对象也会销毁

            c、当传入的参数为false,则仅仅销毁内存中的AssetBundle对象包含的资源

        

    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;//编辑器命名空间的引用
    
    public class TestDemo {
    
        //MenuItem:附加属性
        //自定义工具:提高团队的开发效率
        [MenuItem("Itools/TestBuild")]
    	public static void BuilderAssetBundle()
        {
            string outputPath = Application.streamingAssetsPath + "/Test";
            //BuildPipeline.BuildAssetBundles():只需要提供一个输出AssetBundle的地址即可,
            //引擎会自动根据资源的assetBundleName属性批量打包,自动建立Bundle以及资源之间的依赖关系
            BuildPipeline.BuildAssetBundles(outputPath, 0, EditorUserBuildSettings.activeBuildTarget);
        }
    }
      
      BuildPipeline.BuildAssetBundles():
        1、第一个参数:AssetBundle输出到哪一个文件夹
        2、第二个参数:枚举类型,可以选择多个参数,多个参数之间可以用“|“隔开
          a、CompleteAssets:保证资源的完备性,默认开启
          b、CollectDependencies:用于搜集资源的依赖项,默认开启
            和完整性有点相像,会把游戏物体所依赖的资源一起进行打包,防止有些被依赖的资源没有被打进去
          c、DeterministicAssetBundle:用于为资源维护固定ID,默认开启
            所以的资源都有固定的标记的,在资源的mate文件中的guid:64位组成的字符串,电脑里是随机生成并且唯一,每一个文件的唯一标识
          d、ForceRebuildAssetBundle:用于强制重打所有AssetBundle文件,5.3以后新增
            资源更新了,重新打包,将以前的资源包丢弃
          e、IgnoreTypeTreeChanges:用于判断AssetBundle更新时,是否忽略TypeTree的变化,新增
            打包时是否忽略父子关系
          f、AppendHashToAssetBundleName:用于将Hash值添加在AssetBundle文件名之后,开启这个选项可以直接通过文件名来判断哪些Bundle的内容进行了更新
            (4.X下普遍需要通过比较二进制等方法来判断,但在某些情况下即使内容不变重新打包,Bundle的二进制也会变化),新增
            在包名后缀名后面添加一个Hash表
          g:ChunkBasedCompression:用于使用LZ4格式进行压缩,5.3新增
    
    
    

      

     
            BuildPipeline.BuildAssetBundles(outputPath, BuildAssetBundleOptions.AppendHashToAssetBundleName|BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget);
    

      AssetBundle的适用平台与跨平台性

        AssetBundle适用于多种平台,包括网页应用、移动应用、桌面应用等,可以动态更新,但不同平台所使用的AssetBundle并不相同,在创建离线AssetBundle的时候需要通过参数来指定目标平台,相关关系如表所示:

        

         IOS:在Mac版本的Standlone打包

        Windows:打Android、PC、WebPlayer

     
  • 相关阅读:
    java获取指定月份有几个星期x,获取指定月份跨了多少个星期
    linux下vim编辑器使用
    bash Shell条件测试
    grep与正则表达式
    网络基础--NAT
    网络基础-DHCP
    Python--元组(tuple)
    Python--元组(tuple)
    Linux--用户管理
    Linux--用户管理
  • 原文地址:https://www.cnblogs.com/xingyunge/p/7647826.html
Copyright © 2020-2023  润新知