原地址: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实现)的更多相关文章

  1. docker 运行jenkins及vue项目与springboot项目(三.jenkins的使用及自动打包vue项目)

    docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...

  2. 自动打包iOS项目

    基于Lexrus的博文iOS-makefile,本文对自动打包涉及到的操作步骤以及理论基础进行了适当的补充.     请在阅读本文前先阅读<iOS makefile>.文章地址:http: ...

  3. 解放双手 | Jenkins + gitlab + maven 自动打包部署项目

    前言 记录 Jenkins + gitlab + maven 自动打包部署后端项目详细过程! 需求背景 不会偷懒的程序员不是好码农,传统的项目部署,有时候采用本地手动打包,再通过ssh传到服务器部署运 ...

  4. [Unity3d][NGUI]打包NGUI预制件成Assetbundle 两种思路.

    http://www.58player.com/blog-2537-85030.html 接上文,项目中因为需要UI热更新,所以我使用了AssetBundle这个解决方案.               ...

  5. jenkins自动打包部署项目

    首先去jenkins的官网下载安装包 https://jenkins.io/   个人下载是长期稳定的那个版本,下载后,得到一个.msi的安装包: 点击进行安装,然后一直点击下一步. jenkins会 ...

  6. docker 运行jenkins及vue项目与springboot项目(二.docker运行jenkins为自动打包运行做准备)

    docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...

  7. ANT自动打包U3D安卓项目研究笔记

    概述 因项目使用Atlassian Stash作为项目源码管理端,且其支持Ant命令自动编译,可使其根据最新的代码自动打包,故产生该研究Ant打包的任务.在此将研究过程及一些相关知识整理记录在此. 本 ...

  8. unity3d在菜单栏,一键设置Player setting及自动打包并设置apk的存储位置

    项目进行中,领导要求能够进行一键设置Player settings及自动打包并设置apk的位置,所以自己就上网搜索了很多大神的文章.最后是完成了领导需要的功能,在这里记录并分享一下(此项指针对安卓ap ...

  9. 关于unity3d插件的自动打包

    开发中,迩可能会遇到在xcode里添加一些需要调用原生api的方法,可能是game center,可能是内购之类的,但是这些插件实在太多了,所以迩大可不必自己写这些插件,问题在于,国内的一些插件,像9 ...

随机推荐

  1. R语言diagram包画订单状态流图

    代码如下: library("diagram") #a <- read.table(file="clipboard",header=TRUE) write ...

  2. 使用Playground编写第一个Swift程序

    从控制台输出“HelloWorld”是我学习C语言的第一步,也是我人生中非常重要的一步.多年后的今天,我仍希望以HelloWorld作为第一步,与大家共同开启一个神奇.瑰丽的世界——Swift编程. ...

  3. [转载]IIS下开启php扩展失效? 感谢作者 本人泪流满面

    用户反应,空间不支持GD.系统环境是IIS PHP.   先用phpinfo探了一下,确实没有找到gd的影子.然后检查php.ini,发现gd扩展没有开启(windows下安装的php,其所有php扩 ...

  4. SQL server 常见用法记录

        -- ============================================= -- Author:                tanghong -- Create da ...

  5. Java中的队列:java.util.Queue接口

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. Queue接口与List.Set同一级别,都是继承了Collection接口.Linked ...

  6. 一本JavaEE的案例书

    案例很好.1.网上书店 2.AJAX网页聊天

  7. 给LinkLabel文本绘制颜色

    我在form中有一个linkLabel,显示文字是“中秋快乐”.现在我希望其中的“中秋”两个字用红色字体显示,“快乐”用黑色字体.请问如何在一个linkLabel中实现上述效果? 答案: privat ...

  8. js给数字加三位一逗号间隔的两种方法(面试题)

    方法一:   <script type= "text/javascript"> //保留三位小数,toLocaleString() 方法可把一个 Number 对象转换 ...

  9. ubuntu1304下安装boa服务器

    本测试在ubuntu1304下测试,具体步骤如下: 1下载源码:www.boa.org,可在ubuntu下自带的火狐浏览器下载,也可在window下下载,然后再移到ubuntu下: 2打开终端,将bo ...

  10. linux set,env和export

    set,env和export这三个命令都可以用来显示shell变量 set 显示当前shell的变量,包括当前用户的变量 env 显示当前用户的变量 export 显示当前导出成用户变量的shell变 ...