[小明爬坑系列]AssetBundle原理介绍

一.简介

  Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利。

二.移动平台特点

  Assetbundle是可以把预制,文件以及场景都打包到Assetbundle中去的,但是在移动平台上,有诸多限制.

  首先,移动平台上虽然能打包场景,但是因为移动平台是不更新脚本的,所以即使是更新了,新增加的脚本也不会执行.如果需要做热更新,会有其他的办法.

  第二,因为移动平台上不能通过这种方式直接更新脚本,所以在对脚本进行大更新的时候,需要将更新脚本的大更新放应用市场,小版本更新用Assetbundle.

  第三,在对不同的平台进行打包的时候,需要设定打包目标平台,即参数:BuildTarget,打完包之后的数据不同平台之间不能通用.

三.打包数据的存储

  因为打包后一般先将数据暂时放置在StreamingAssets下,但是不同平台下StreamingAssets的路径是不同的,是十分需要注意的,在面对不同平台的时候,加载的路径是要不同的.在移动平台中,,因为StreamingAssets是只读的,所以在项目中,要将数据放到沙盒文件夹下.操作步骤如下:

1.打包出来的Assetbundle我们自己用LZMA压缩,上传到服务器上。

2.IOS或者Android下载这些assetbundle

3.解压缩这些assetbundle并且保存在Application.persistentDataPath 目录下。

4.以后通过AssetBundle.CreatFromFile  读取assetbundle。

四.总结

  对游戏中所有资源进行打包,比如按类型分为五个大部分  界面,模型,特效,声音,场景,脚本。

  1.界面部分:

  公用资源包(可复用的资源包)和 每个界面独有得资源包(不可复用的资源包)统一使用Prefab 打包成.assetbundle 二进制格式。

  2.模型部分:

  按角色分类,统一使用Prefab 打包成.assetbundle 二进制格式。 模型部分包括模型文件与动画文件,每一个模型文件对应一组动画文件。(如果模型需要换装还需提供对应换装的模型与贴图) ,因为unity4的重定向动画不支持动态加载,所以目前不需要考虑 不同大小 不同规格 不同性别 的模型重定向动画。

  3.特效部分: 统一使用Prefab 打包成.assetbundle 二进制格式。 

  4.声音部分: 统一使用Prefab 打包成.assetbundle 二进制格式。 

  5.场景部分:场景和前面的有点区别,场景需要导出烘培的光信息并且只能烘培场景之上永远不动的模型,但是这些永远不动的模型有可能会同时在多个场景中使用,所以场景烘培完毕后要把重复使用的对象删除,(运行游戏在动态的加载进来)场景中只保留该场景中永远不会变的模型,以及烘培的光照信息。 打包场景后会生成.unity3D 二进制格式,它和 assetbundle 打包方式是不同的。(另外,也可以考虑 json xml 二进制 来动态组装场景)。  

  6.脚本部分:如果Prefab上是带脚本打包Assetbundle的话  脚本是不会被运行的(移动平台), 但是unity有一个技巧,Prefab上的脚本 如果本地有的话它会把本地的同名脚本绑定在Prefab对象上,它会很好的执行。 

  7.Prefab打包技巧: Prefab打包时自身是不占多少空间的 <=1KB  但是Prefab上是可以关联  这五大部分 “界面,模型,特效,声音,场景,脚本”以及在Hierarchy视图中 坐标/缩放/旋转。 关联这些信息以后就会很大,所以为了避免资源的浪费尽量避免Prefab重复关联。

  一个prefab下面可以同时关联多个游戏对象 ,这里举个例子如果你的 Prefab下面放了一个模型 它的大小可能是500k  ,在 Prefab下面放了十个完全相同模型 它的大小可能是501k 。 如果Prefab下面放了两个不同的模型,它的大小可能就会是 500k x 2 的size  ,也就是说Prefab与关联的数量是无关的 。 

  8.加密部分: assetbundle 是可以转换成 字节数组 ,客户端与服务器约定一组解密 字节数组的算法就可以实现资源加密。

原文地址:https://www.cnblogs.com/WongSiuming/p/5082638.html