最近一段时间都在想办法优化游戏资源,记录一下
* Unity引擎会自动把Resources文件夹里面的资源打到包体里,这个想必大家都清楚。它这样做的好处是:只要你把资源丢到这个文件夹里,资源就会自动放到包体里。坏处是:如果你的游戏不是单机,并且需要划分出资源包,那么由于Resources文件夹的机制,非常有可能会导致一个游戏包里出现资源(图片等)重复。这是因为在Resources里面的资源一定会打进包里,打资源包的时候,如果资源包的一些预设也使用到Resources里面的资源,资源包它是不会去判断它所使用到的资源是不是在Resources文件夹内,它只是简单地把它所用到的资源打进它自己的包里。这样一来,就会出现一个游戏包里出现两张一模一样图片的情况(一张在Resources打出来的resources.assets,一张在资源包panelPrefab.bundle里)
* 其实Untiy官方也建议成熟的项目不要使用Resources文件夹来存放游戏资源,资源优化的第一步就是想办法把Resources的资源给移走,之后删除这个文件夹。
* 游戏内几乎所有的资源都应该以 .bundle的形式进行保存
* 介绍一些基本知识。Unity引擎会给每个放进Assets文件夹内的脚本,图形,预设自动生成 .meta文件,.meta的作用是使每个文件都有它独一无二的标识符guid,unity通过guid的管理来获得每个文件。
* 如果你打开 .prefab文件你会看到里面会出现很多“guid:86858c9f1b470fa40acad6039e725e4e”,这些guid就是这个预设所用到的资源。在打AssetBundle的时候,unity会找到这个资源用到的所有guid,然后把它们放在一起,形成.bundle文件。
* 打出来的资源包会附带.manifest文件,这个文件的作用是,告诉你这个资源包它里面包含了哪些预设资源,其次这个资源包依赖于哪些资源。
* 加载资源包里面的预设时,要先加载他的依赖资源(放在其他资源包里里面的资源),否则会出现资源丢失的情况。
* 资源的管理当然会涉及到资源的分类,资源的打包,资源的加载,资源的卸载,资源的热更。下面按照步骤来讲。
    ** 资源的分类
        *** 除了要办法避免资源重复外,做好资源的分类可以方便资源热更,减少内存占用,加快场景加载速度。一般来说一些非常独立的预设作为独立的资源包,通用性,关联性很强,同类别总量不大的预设打在同一个包体里。像人物资源,模型资源比较独立,图形,动画,模型等都只为它一个预设所使用,这种适合单独作为一个.bundle;像ui界面,lua脚本,场景专用资源适合放在一起打一个包。
        *** “独立”资源包的好处是更新资源时,下载的包体比较小;缺点是太多太小的资源加载比较慢。而“大”资源包与此相反。
        *** 特别说一下ui资源。最好是把每个图集作为一个bundle,然后所有的panel.prefab作为一个bundle。打包时先打atlas,再打panel.prefab,这样可以避免图集重复,并且panel.bundle的包体小,加载速度较快
    ** 资源的打包
     

*** 常用方法有:
             string path = Application.dataPath;
             var buildArray = new AssetBundleBuild[count];//创建资源包对象
             buildArray[0].assetBundleName = Application.streamingAssetsPath + "/Role/Role1.bundle";//打出来的包名"Role1.bundle"
             var assets = new string[2];
             assets[0] = Application.dataPath + "/Res/Role/Role1.prefab";//要打的资源
             assets[1] = assets[0] + ".meta";//这里要注意.meta文件一定要跟上
             //如果还有其他资源要打在同个包里:assets[n] = Application.dataPath + "... ...";
             buildArray[0].assetNames = assets;//这个.bundle包含的所有资源
             BuildPipeline.BuildAssetBundles(path,buildArray,BuildAssetBundleOptions.ChunkBasedCompression,BuildTarget.Android);//打资源包
         *** 资源的依赖。资源的依赖关系由这个方法BuildPipeline.BuildAssetBundles() 里面的参数AssetBundleBuild[]决定,排在Array后面的资源会自动依赖于前面的资源,这也就是为什么在打ui预设的时候,atlas.prefab要放在panel.prefab前面。
     ** 资源的加载
         ***