Unity3D 自动打包整个项目(以AssetBundle实现)
原地址:http://blog.csdn.net/huang7jiao/article/details/18370653
需求:
在移动开发中,手动控制资源的加载、释放和热更新,是很有必要的。
而Unity通过AssetBundle可以实现该需求,但是如果项目资源多起来的话一个个手动打包成AssetBundle则很麻烦。
而本文正为此提供一套一键打包的方案。
资源分类、加载和实例化过程:
分类资源:
先将游戏资源分类,这里说的分类不是按资源类型(声音、贴图等)来分,而是按照打包进同一个AssetBundle的资源来分。 一般游戏按照使用频率、游戏流程、资源大小来分到不同的AssetBundle中。
举个例子:一个跑酷游戏,可将资源分为: 开始界面,主界面,关卡一资源,关卡二资源,主界面和各关卡的共享资源(如角色服装),各关卡间的共享资源(如血条,金币)。注意这里说的资源是图片,模型,声音等一些体积较大的文件。
加载资源:
游戏流程中AssetBundle的加载及卸载:
将“场景内所有GameObject”变为Prefab并打打包成AssetBundle:
在上一步中,只是将资源打包成AssetBundle,而驱动游戏进行的游戏逻辑(场景上的GameObject)则没做处理。
这样的话会导致打包出来的游戏包重复包含资源(AssetBundle和场景GameObject引用的资源重复)。
所以我们需要将场景上的GameObject也一并打包成AssetBundle,在游戏真正运行时才加载该AssetBundle并实例化。
拿unity 2d例程(2DPlatformer
)做说明,即将Scene里的所有文件变为一个GameMain.Prefab,并导出为AssetBundle。
用于在之后的游戏运行后加载并实例化。
那么上一步的流程将会变为:
标记项目资源:
分类加载的思路有了,现在只差一个自动将所有资源打包成AssetBundle方法。
我们需要借助Asset Labels(Unity的标签系统)。
思路是按资源的不同分类(前文提及的分类方式),来标记每个资源。
举个例子:
上面4个资源属于关卡1的资源,因此我将他们同标记为AsRes_Level1,
他们将会一起打入AsRes_Level1.assetbundle包中,以备游戏中加载。
需要注意的是,其中AsRes_是固定标识,以便打包脚本分辨。
用这种方法则可将游戏资源一一归类。
但是,我们还有一个麻烦,就是需要先将比较笨重的资源(图片,声音,模型)先打包,然后再将驱动逻辑(例如,前面说的GameMain.Prefab)打包,
只有按这样的顺序打包才能使驱动逻辑引用到之前的打包的美术声音资源。
解决方法也比较简单,将驱动逻辑标记为AsPack_即可。
OK,就这样将整个项目的资源标记好之后就可以进行一键打包了。
例程:
为了更好的说明,我利用Unity的2DPlatformer做了一个样板工程。
其中 Editor/ResPacker.cs 是打包脚本,会在菜单Assets下新建“Build All Assets To Bundle” ,用于一键打包。
_Loader/Test_Loader.unity 是测试场景,用于加载位于StreamingAssets下的AssetBundle,并实例化‘驱动逻辑’(GameMain)。
例程下载。
注意:
在例程中有一个Bug,在编辑器中导入AssetBundle包的话,会使Sprite 上Sorting Layer变为Default,而导致图层混乱,而Build这个场景出来之后再运行则不会。
Unity3D 自动打包整个项目(以AssetBundle实现)的更多相关文章
- docker 运行jenkins及vue项目与springboot项目(三.jenkins的使用及自动打包vue项目)
docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...
- 自动打包iOS项目
基于Lexrus的博文iOS-makefile,本文对自动打包涉及到的操作步骤以及理论基础进行了适当的补充. 请在阅读本文前先阅读<iOS makefile>.文章地址:http: ...
- 解放双手 | Jenkins + gitlab + maven 自动打包部署项目
前言 记录 Jenkins + gitlab + maven 自动打包部署后端项目详细过程! 需求背景 不会偷懒的程序员不是好码农,传统的项目部署,有时候采用本地手动打包,再通过ssh传到服务器部署运 ...
- [Unity3d][NGUI]打包NGUI预制件成Assetbundle 两种思路.
http://www.58player.com/blog-2537-85030.html 接上文,项目中因为需要UI热更新,所以我使用了AssetBundle这个解决方案. ...
- jenkins自动打包部署项目
首先去jenkins的官网下载安装包 https://jenkins.io/ 个人下载是长期稳定的那个版本,下载后,得到一个.msi的安装包: 点击进行安装,然后一直点击下一步. jenkins会 ...
- docker 运行jenkins及vue项目与springboot项目(二.docker运行jenkins为自动打包运行做准备)
docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...
- ANT自动打包U3D安卓项目研究笔记
概述 因项目使用Atlassian Stash作为项目源码管理端,且其支持Ant命令自动编译,可使其根据最新的代码自动打包,故产生该研究Ant打包的任务.在此将研究过程及一些相关知识整理记录在此. 本 ...
- unity3d在菜单栏,一键设置Player setting及自动打包并设置apk的存储位置
项目进行中,领导要求能够进行一键设置Player settings及自动打包并设置apk的位置,所以自己就上网搜索了很多大神的文章.最后是完成了领导需要的功能,在这里记录并分享一下(此项指针对安卓ap ...
- 关于unity3d插件的自动打包
开发中,迩可能会遇到在xcode里添加一些需要调用原生api的方法,可能是game center,可能是内购之类的,但是这些插件实在太多了,所以迩大可不必自己写这些插件,问题在于,国内的一些插件,像9 ...
随机推荐
- linux umount 提示device is busy 的解决
linux umount 提示"device is busy" 终极解决 为了干净地关闭或热交换 UNIX 或类 UNIX 系统上的存储硬件,必须能够卸载使用此设备上的存储的所有文件系统.但是,如果正 ...
- svn 服务器的搭建 on Ubuntu
Subversion 如何在Ubuntu下安装配置Subversion服务器.已经配置好,不过没有配置开机自启动, 需要的时候,使用如下命令开启svn服务svnserve -d -r /opt/s ...
- 手机看youtube的方法|一个好用的VPN
俗话说:网络无国界.但是由于天朝的限制,我们无法访问YouTube .谷歌.twitter等一些国外网站. 这个时候我们就需要FQ.最直接有效的方法就是:VPN(虚拟专用网络). 虚拟专用网络的功能是 ...
- easyui combobox 模糊检索数据并填充
$("#id"),combobox({ url:'', ...... filter:function(q,row){ var op = $(this).combobox(&qu ...
- JAR、WAR、EAR 区别
JAR包 JAR 文件格式以流行的 ZIP 文件格式为基础: 与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库.组件和插件程序,并可被像编译器和 JVM 这样的工具直接 ...
- String的几种初始化方法的区别
参考了: java中String的两种初始化方法 String a; String aa = ""; String aaa = "123"; String ...
- web组件新学--layer
在之前项目后台管理界面开发中,不知道有layer这样好用的组件,我的内心是这样的的...呀!这个框架有弹框,哈哈哈,好开心,不用自己写遮罩层,不用自己写弹框,好开森.. 当知道有layer之后.... ...
- Uploadify 3.2 not work in IE10
uploadify版本:Uploadify Version 3.2.1 現象:在IE10下uploadify上傳按鈕點擊失效 解決方案:替換uploadify下的js引用包 替換文件下載地址: 下载地 ...
- angularJs--$on、$emit和$broadcast的使用
$emit只能向parent controller传递event与data $broadcast只能向child controller传递event与data $on用于接收event与data 例子 ...
- 伪元素content的应用
日常开发中,我们常用:before,:after来实现一些效果,比如 – 边框 – 图标 此时的content中只是为了伪元素能渲染出来而声明 1 2 3 div:before{ content: & ...