*最近项目更新了Unity5.5.2,顺便更新了项目的ui打包,也更新一下这边的笔记
首先打包分为两部分,一部分是打包成Assetbundle包,一部分是从Assetbundle包解包出来成为可用的资源。
首先说第一部分 打包
所有资源都可以打包,甚至不是资源(一些数据)也可以打包,只要你需要。
打包出来的东西都可以直接用,一个字体,一个Texture,一个Prefab,一个场景,都是一打出来成Assetbundle包就可以直接用,但是为什么大家还是要各自开发自己的打包流程呢?
最重要的原因就是,如果不论什么都直接打包,比如你在开发两个UI界面,这两个UI界面都用到同一个Texture,同一个Font,而你又各自打包两个Prefab,这时在两个bundle包里就都会包含这个Texture和这个Font,也就是它重复存在占用了多一份内存。
所以为了解决这种问题,基本上每个项目都会在打包的时候把Texture,Atlas,Font等用到的相同资源剥离,记录,之后再打包,等到用的时候再加载回来。
这就是每个项目自己的打包流程主要的开发工作。
而现在的unity版本(我们项目用的是unity5.3.5f)提供了剥离方法,以前的unity版本需要自己剥离。等下在下面讲打包的时候两种都会讲到。(虽然你只需要用一种,为了详细 就两种都讲)
接下来讲我们项目的打包流程。
首先打包一般的Texture,Atlas都比较简单,有两个是比较特殊需要独立开发的情况
1.打包Panel(UI界面)
2.打包Scene(游戏场景)
先来说一下打包Panel
一个UI界面里你会用到很多图片,很多字体,不管是Atlas或者Texture你都需要把这些剥离开来。
打包Panel我们使用自己的剥离方式。
假设现在有一个BattleUI.Prefab
下面是打包步骤。
1.清理数据,建立文件夹(存放不同类型的文件,如Texture、Atlas)
2.PrefabUtils.Instantiate实例化这个Prefab。
3.获取这个实例化后的Prefab下的所有动态组件(这个看不同项目)
4.获取这个GameObject上挂的所有NGUI脚本。(如果有动态组件,每个动态组件也要遍历所有NGUI脚本)
5.把NGUI脚本复制下来用一个类存放并挂载这个GameObject上,如:
Public Class PRefabHierarchyInfo:MonoBehavior
{
public Transform[] transforms;
public UILabel[] uilabels;
public UIPanel[] uipanels;
public UISprite[] uisprites;
}
6.把引用到的Texture、Atlas、Font、Panel(界面)记录下来
7.把原本NGUI脚本女上引用到的Texture.Atlas全部置空
*步骤3-7的目的在于,把这个界面或者多个界面用到的Texutre、Atlas信息来出来,统一处理,不然直接打包就会一个资源存在多份
8.把步骤6找到的所有资源打包BuildPipeline.Build(如果是Atlas不用CreateGameObject,其他要用PrefabUtility.CreatePrefab())(这里还可以根据不同平台不同要求设置Atlas属性等)
9.打包Panel
*原本想写在这里,发现东西太多另起一篇文章来记录
*下面是更新新的打包ui方式链接
http://blog.csdn.net/chrisfxs/article/details/60136875
接下来是打包Scene
打包场景的目的是在于,把场景中的所有动态组件抽出来,把所有用到的Material和Shader分离并单独打包
而我们打包场景的方式选择现在unity的自动剥离方法(改AssetBundle名即会独自打包(自动分离)(用AssetImporter类,改assetImporter.assetBundleName))
下面是打包步骤:
1.清除所有AssetBundleName
2.找到项目里所有需要打包的Scene
3.找到每个Scene下的所有需要打包和需要独立打包的东西(如Material、Shader)
4.获取所有需要打包的物件的资源地址,一个场景写一个Config文件并存放到里面
5.改每个scene的AssetBundleName
6.改每个需要单独打包(剥离)的物件的AssetBundleName(如Shader、Texture、Material、GameObject(动态组件))
7.BuildPipeline.BuildAssetBundle()
打包系统会把重新改了AssetBundleName的物件剥离并独自打包,剩余的统一打成一个场景包
这样就基本完成打包工作。
接下来是解包。
加载Panel
1.加载AssetBundle(AssetBundle.LoadFromFileAsync(path))
2.放入内存
3.在打开界面的时候实例化界面类,把数据还原。如,CDialog为界面类,CPanel为这个界面的数据类,把之前打包流程6-7记录的Atlas和Font等数据重新赋值回去
加载Scene场景
1.加载Config
2.加载场景Scene到内存
3.移步实例化Scene
4.加载Shader,Texture
5.加载Material
*4.5这两个顺序不能,因为之前打包有依赖关系,加载Material之前要先加载Shader、Texture
6.加载动态组件(根据之前的Config重新摆放物体等信息)
...