您的位置:首页 > 移动开发 > Unity3D

【小松教你手游开发】【unity系统模块开发】Unity Assetbundle打包笔记

2018-03-10 20:37 459 查看
*最近项目更新了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重新摆放物体等信息)

...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  手游开发
相关文章推荐