unity3d在5.0之后打包Assetbundle变得比之前简单多了,最简单的办法就是把所有资源都标记Assetbundle的Flag,然后直接调用unity3d的打包Assetbundle即可,详情可参见官方文档。

通过标记打包方式的优缺点

这种打包方式的优点在于简单,缺点在于不好管理需要需要打包的资源。举例来说就是你必须把所有需要打包的资源都标记上Assetbundle的Flag,(包括prefab,texture,material,fbx,animation等),最后容易把资源打得特别散,造成每一个文件都是一个assetbundle。这样其实对于加载是特别不友好的,每一个assetbundle的引用都至少会有大约4kb的内存。如果不这样做,只对prefab做标记的话,容易造成资源的重复打包,一些texture,fbx可能会多次打进不同的assetbundle里。

通过buildmap方式打包的优缺点

unity还提供了一种buildmap的打包方式,可以自己管理需要打包的资源,优点在于自己管理依赖关系,可以最大程度的控制打包粒度,缺点就是需要写点代码,大约500行。

使用buildmap打包的流程

1.目录管理

管理好你的资源目录,把需要单独打包和不需要单独打包的文件放在不同的目录下,默认需要单独打包的只有预制件目录,其他的目录一般可以根据依赖自动打进包里,可以参考下面的目录结构:

Assets

|--Prefabs

|--a.prefab

|--b.prefab

|--Textures

|--a.tex

|--b.tex

|--c.tex

|--Materials

|--Aniamations

|--Models

|--Other

我们打包前会遍历Prefabs目录,得到每一个prefab的依赖,构建一棵依赖树,根据依赖树进行打包。

2.构建依赖树

unity3d提供了 AssetDatabase.GetDependencies的方法来获取一个文件的依赖关系,我们假设遍历完预制件文件夹后得到的依赖关系如下:

a.prefab依赖于a.mat,a.fbx,common.animator;

b.prefab依赖于b.mat,b.fbx,common.animator;

a.mat依赖于a.tex,b.tex

b.mat依赖于b.tex,c.tex,d.tex

最终形成的依赖关系树如下:

buildtree.png

注意:unity提供了获取预制件的直接依赖和所有依赖(包括间接依赖),构建依赖树时需要获取预制件的直接依赖,再依次获取每一个依赖文件的直接依赖,直到获取到最底层的依赖,由此构建出所有预制件形成的依赖树。

3.根据依赖树打包Assetbundle

如果树的一个节点有2个或以上的父节点,则该资源被2个或多个其他资源所依赖,该节点需要打包成独立的Assetbundle。

如果树的一个节点没有父节点,则该资源是最顶层的预制件,需要打包成独立的Assetbundle。

打包时应该从最底层开始逐层向上遍历,在每一层寻找是否有节点的父节点数量大于1或者等于0,将满足条件的节点打成Assetbundle,直到遍历完整棵树。因为打包Assetbundle的时候是会将所有被依赖到的文件都自动打进Assetbundle里,所以从底层往上打包可以让上层的Assetbundle直接依赖到底层的Assetbundle,避免了资源被重复打进不同的Assetbundle里。

根据上面的树,最终打出来的Assetbundle如下:

b.tex.assetbundle

common.animator.assetbundle

a.prefab.assetbundle

b.prefab.assetbundle

这样既不会每一个文件都打出一个assetbundle,也省去了手动管理依赖关系的繁琐。

关于场景的打包

因为unity3d 5.x之后的版本不再将光照贴图的信息存放在预制件中,因此如果做过光照烘焙的场景,就必须把预制件直接摆放在场景中,动态加载预制件将丢失光照贴图的信息。对于这种情况,摆放在场景中的预制件可以不放在最终打包的预制件目录中,因为打包场景的时候会将场景的资源都统一打包,不会依赖到你所打包的预制件,因此场景中的预制件建议单独存放目录。

关于其他文本文件

其他的文本文件例如json,lua或者其他配置文件,可以直接在打包的时候复制一份到StreamingAssets,保证最后我们所有的资源在手机上都通过StreamingAssets来加载。

unity热更新json_Unity热更新之AssetBundle打包篇相关推荐

  1. unity python热更新_Unity热更新介绍和测试方法

    最近项目中增加了热更新了功能,程序也完成了相应的开发,接下来就需要对这个模块进行相应的测试工作了,在测试开始之前,了解下其原理总是很有好处的. 1:什么是热更新 简单的理解就是:用户重启客户端就能实现 ...

  2. Unity应用的iOS热更新

    Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda ? 什么是热更新 ? 为何要热更新 ? 如何在iOS 上对Unity 应用进行热更新 ? 支持 ...

  3. 【游戏开发高阶】从零到一教你Unity使用ToLua实现热更新(含Demo工程 | LuaFramework | 增量 | HotUpdate)

    文章目录 零.前言 一.我做的热更新Demo 1.效果演示 2.流程图 3.工程源码 二.为什么要有热更新 三.Unity如何支持热更新 1.热更C#代码 2.热更lua代码与资源 四.Unity中集 ...

  4. Unity游戏开发-游戏热更新以及登录流程

    本篇主要分享基于热更新的游戏初始化方案. 整体初始化的流程大致为:检查是否需要解压资需要则解压,之后再检查是否存在需要热更新的资源文件需要则更新,更新完成后则初始化结束可进入登录界面. 关于登录这块的 ...

  5. 游戏资源差异化热更新及加密全攻略(Assetbundle 打包 AssetBundle 加载 AssetBundle 加密)

    游戏热更新资源加密的必要性 unity中资源热更新还是Assetbundle为主,资源使用越来越广泛,ab包里可以包含图片.视频或者脚本,都是游戏的知识财产,如果被破解者或者竞争对手解开,拿到里面的内 ...

  6. untiy3d 热更新 脚本 动态更新 c#lite 图形学

    以下文章转载自图形学大神李总老师的博客. C#Lite是李总自己做的一个开源项目,旨在解决因u3d在ios平台不能动态更新以及lua脚本在u3d上效率低下的问题.作为4年前就给李总当小弟,被李总狂虐的 ...

  7. 游戏热加载、即时加载、热更新、热补丁原理流程图

    本文主要描述游戏及软件工程中的更新原理及流程,具体代码会在一周内追加. 看什么看 你怎么又复制 一.热加载实现流程 所谓热加载,就是将资源放在服务器端,当客户端运行时,先运行资源加载程序,待所有资源加 ...

  8. idea修改代码后没有重新编译_SpringBoot中实现代码修改之后的自动更新与热加载...

    在实际的开发过程中,我们经常修改代码之后,手动的重启项目,查看修改效果.那么有没有一种方式能够快速的.自动的帮我们将修改代码自动更新,避免手动重启,从而提高开发效率呢?是有的,对于这个功能很多人对功能 ...

  9. less webpack 热更新_webpack---less+热更新 使用

    最近尝试用less写界面,webpack进行打包,然后发现每次修改less时都需要重新执行webpack打包一下,于是就想到了webpack热更新这个功能. 一.使用less less是一门css预处 ...

最新文章

  1. 从自监督学习主流方法、最新工作进展,看未来前景研究方向
  2. [算法]华为笔试题——拼音与英文转换
  3. 苏教版四下用计算机计算,苏教版四年级下册数学单元测试-4.用计算器计算 (含答案)...
  4. lists and Variables supported as JIT inputs/outputs. Dictionaries and strings are also accepted but
  5. Android IOS WebRTC 音视频开发总结(四二)-- webrtc开发者大会
  6. 特定于数据中心的人工智能完成任务的速度可以提高两倍
  7. MYSQL交通系统查询,城市公交查询系统的设计与实现(SSH,MySQL)(含录像)
  8. 在vs2005中使用Com连接SAP系统(二)
  9. 解决yarn build时报错:内存溢出FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed
  10. linux 查当前pid_杀死僵尸进程,你需要这些神奇高效的Linux命令行
  11. 【LeetCode1046】最后一块石头的重量(堆heap)
  12. HDU多校联合赛(1007 Magical Forest)模拟题
  13. jsp 动态添加一行数据_大数据从入门到深入:JavaEE 之 动态网页开发基础 JSP的数据交互(3)...
  14. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的大学生健康档案管理系统
  15. .net|dotnet应聘人员应该掌握的知识点
  16. oracle热点表online rename
  17. laravel安装说明
  18. qu32调音台说明书_Qu-32 数字调音台
  19. python双星号什么运算_Python中的*(星号)和**(双星号)完全详解
  20. group by 为什么 distinct 效率高

热门文章

  1. 【数据结构与算法】二叉树遍历
  2. exe解包和重新打包_pyinstaller打包的exe太大?你需要嵌入式python玄学 前提篇
  3. 类的加载顺序和静态代码块和匿名代码块的区别
  4. html传输php连接mysql数据库_解析HTML、JS与PHP之间的数据传输
  5. matlab保存变量的值,怎么不能保存之前的变量值?求解
  6. HTML字体怎么显示,教你如何用CSS来控制网页字体的显示样式
  7. 左外连接的sql语句_Django数据库连接和使用原生sql语句
  8. 富文本编辑器中空格转化为a_如何对富文本编辑器(FCK Html Editor)的工具栏进行扩展?...
  9. 【小白学习C++ 教程】二十、C++ 中的auto关键字
  10. 深度学习作业(一)手写字体