Unity配置数据打包与解析

这里使用Csv格式进行解析与使用。

一、首先对于Unity的数据读取有这么几种方法:

    在Resources目录下Resources.load直接读取,是只读的。也可以通过C# 流的方式进行读取,而且可以写。

    在StreamingAssets目录下,一般是对文件进行压缩,因为数据量比较庞大,压缩以减少安装包大小。压缩方式采用UnityAssetBoudle的模式进行打包。

二 对数据打包

Unity资源 什么是Asset : Mesh ,material ,texture,Audio ,txt等

Assets、Resources 、StreamingAssets、AssetBundle 。

   Assets文件夹:只有被引用的资源会被打包。 适合存放静态资源,不能动态加载。

   Resources :支持动态加载、Resources.Assets文件2G限制,随安装包完全下载、无法动态更新。

  StreamingAssets:不同平台放置位置不同。保持文件原始格式(比如存放原始jpg文件,而不导入成内部格式),随安装包完全下载集合,压缩,动态加载,动态更新。

  4.x的做法:

 依赖关系导致资源重复。 先将重复使用的资源打包成一个ab ,然后在打包别的资源。

打包策略 :尽可能的减少冗余资源 ,减少AppSize,减少网络下载流量

      分类打包

                   按类型,或者用途打包

      AssetBundle 代销尽量不超过1M ,减少IO压力。

 如何处理复杂依赖关系: 使用数学方法分析,有向图。 入度 ,出度。 一个资源是有向图的一个节点。有一个资源依赖与它就有一个指针指向它,这叫“入度”,当这个资源依赖于另一个资源这叫“出度”。

Unity配置数据打包与解析_第1张图片Unity配置数据打包与解析_第2张图片

 获取依赖关系:

    AssetDataBase.GetDependencies(string)

  首先以每一个资源为一个节点,以最低粒度构造有向图

   Unity配置数据打包与解析_第3张图片Unity配置数据打包与解析_第4张图片

 资源入度大于等于2的情况一般是资源重复

Unity配置数据打包与解析_第5张图片Unity配置数据打包与解析_第6张图片

Unity配置数据打包与解析_第7张图片Unity配置数据打包与解析_第8张图片

迭代处理

Unity配置数据打包与解析_第9张图片

  先构建有向图,得到依赖关系以图的形式构建,找到入度为o的源点,入度节点为一的可以删掉,找到入度大于等于2的共享资源,从源点开始深度遍历有向图。 保存依赖关系,然后按依赖关系 加载:

      Unity配置数据打包与解析_第10张图片Unity配置数据打包与解析_第11张图片

 

 5.X的 资源打包

 手动配置Asset和 AssetBundle的映射关系

配置好后 使用 BuildAssetBundles(string outputPath)   CollectDependencies总是开启。 如果存在共享资源仍可能存在资源重复。

 

 使用脚本进行: 

  Unity配置数据打包与解析_第12张图片Unity配置数据打包与解析_第13张图片

Unity配置数据打包与解析_第14张图片直接收集哪些入度为0,哪些入度为1,哪些入度为2

 

Unity配置数据打包与解析_第15张图片

加载卸载 ,manifest 文件依赖关系在这里面 ,全局和每个manifest文件

Unity配置数据打包与解析_第16张图片Unity配置数据打包与解析_第17张图片

 

   ①打包编码,他打包的原理和Rar zip压缩一样,底层用的是zip的方式。对于加密可以把打包出来的文件二进制化,然后对二进制的bit进行加密,然后解密。5.0后也有加密方式,也可以自行加密。

   unity 资源管理小结:AssetDatabase 对资源的操作基本都是通过这个类来实现。

   将所有csv文件转化为byte文件,创建一个asset,把打包出来的文件做成ScriptObject,更容易序列化和反序列化。

   使用ScriptObject序列化。

  ② 打包的依赖性。

    打包处理: 建立Assets到AssetBundle的映射 : 

   脚本方式: Assetimporter.assetBundleName 将映射关系保存在 Asset Database、meta file中

   普通的Assets

    一个Asset 只能标记到 一个AssetBundle 

    不能标记script

  场景(Scene)

            不能Sence和普通的Asset标记在同一个AssetBundle

  文件夹

           包含他及其所有子文件夹的Assets

  使用相对路径

 完全从脚本打包 BuildPipeline.BuildAssetBundles(

                                                   string outputPath,

                   AssetBundleBuild[] builds,

                   BuildAssetBundleOptions options,

                   BuildTarget targetPlatform);

管理Assets 到 AssetBundle的映射 AssetDataBase

 AssetBundle创建选项 这些是始终启用的: CollectDependencies

                                                         CompleteAssets

                                                        DeterministicAssetBundle

不变的 DisableWriteTypeTree

          UncompressedAssetBundle

新的AssetBundle创建选项 ForceRebuildAssetBundle

                                    IgnoreTypeTreeChanges

                                    AppendHashToAssetBundleName(当AssetBundle变化时产生不同的名字,易于检测哪些AssetBundle是需要重新上传到CND)。

查找AssetBundle ,AssetBundle的Search filter 

         b 可以与其他Search Filter共同使用 

         t    类型

         l    标记

         b   AssetBundle

 

AssetBundle 的 hash值 考虑从一下各项产生: Asset files 、Type trees、BuildTarget、BuildOption、Callbacks...

你可能感兴趣的:(Unity配置数据打包与解析)