Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle.

我们也来说说AssetBundle

我们试全面的分析一下Unity3D提供的资源加载机制

1.Resources//内嵌资源,使用方法Resources.Load,可以加载任意种类的资源,不能动态修改,卒。

2.StreamingAssets//随包资源,使用方法IO或WWW.LoadWWW.Load可以加载任意种类资源,IO仅限bytes 和 text。

3.WWW 从网络下载并加载

4.WWW 从网络加载AssetBundle

一和二显然不具有热更新的效果,这里就不做讨论。

3 4都是从网络加载,他们有什么区别呢。

首先说3,这是没有缓存的,我们显然不想让用户重复的浪费流量,不可取。

然后是4,assetBundle提供了一个版本号来做缓存比对,可以比较好的起到更新的目标

assetBundle原来就是Unity3D为我们准备的解决方案,难怪每本书都会大篇介绍AssetBundle,后文简称AB。

每本书都告诉你,AB很强大,AB帮你解决了跨平台问题,帮你解决了依赖关系。

而这个系列,不打算只讲别人讲的东西,我们要告诉你一些小秘密。

AssetBundle是天使还是恶魔

首先AB的确很好很强大,他能收纳Unity自己的所有资源种类,贴图、材质、shader、预设。

然后可以每平台支持,这就是第一个陷阱,注意是每平台支持,不是多平台支持。

每个平台要单独导出,而每个平台到底差了些什么呢?答案是,nothing。

那么为什么每个平台要单独导出呢?因为Unity考虑到每个平台的质量关系,进行了质量相关的差异化。

而最大的质量差异,源自贴图。

有些平台贴图不压缩,有些平台贴图要压缩,而且根据不同的平台特性,套用不同的压缩算法,先压过再存到包里。

这就是AB帮你干的最主要的事情。

听起来很贴心呢,等等,你是不是忘了一个特定的命题,这个命题叫做UI。

压缩的图片会有质量损失,UI贴图我们通常是不压缩的。

然后UI还会触及到AB的另一个问题

以NGUI为例,NGUI的资源关系比较复杂,有贴图-》图集-》布局

不同布局经常交叉引用贴图

如果用AB想把每个界面分开打包,给用户最小的资源更新量,这个任务可以用灾难来形容。

最终热更新推送给用户的东西是以文件为单位的,而AB在小粒度文件并且之间有较为复杂的引用关系这种需求下的使用是一场灾难。

AB对每个平台的差异编译不是可选的,而是强制的,假如你有web、ios、android三个平台,无论如何你都要导出三次。

没了AssetBundle,我们怎么办

把碎片文件下载回来,并且组装

对于UI这个情境,是完全可行的。把布局和图集保存为文本形式,把文本和贴图下载回来,然后组装。

对于其他的场景片段,在有动画和贴图需要压缩的情况下,AB依然是唯一选择。

unity没有提供在运行时压缩贴图的手段,动画也不容易存取,只能在运行时压缩DXT,只有pc和wp8支持。

对于各种各样的资源加载会特别的凌乱么?不会。

其实本质上可以统一成Bytes的处理

Texture可以从Bytes加载

字符串 可以从Bytes加载

AB可以从Bytes加载

自定义二进制存储,嘛本身就是bytes

所以只要我们的下载系统提供下载bytes并缓存,之后所有的资源加载都从Bytes进行,就可以统一起来。

下载部分我们在另一个专题介绍。

下一篇介绍将UI布局保存到文件与恢复。

Unity3d热更新全书-加载(一)从AssetBundle说起的更多相关文章

  1. Unity3d热更新全书-加载(二)如何在不用AssetBundle的前提下动态加载预设

    Unity3D的主要构成大家都知道,首先是场景图,场景图上的节点构成一颗树. 每个节点对应一个GameObject对象 然后每个GameObject有若干个组件 有一些组件会与资源产生关系,比如Mes ...

  2. Unity3D热更新全书-PageZero

    由于深刻的认识到自己是个思维跳跃的人,深入浅出是个我还要努力很久的目标,为了让大家不至于在我乱七八糟的文字中迷失,特整理目录一份 无分类 <Unity3D热更新全书-何谓热更新,为何热更新,如何 ...

  3. Unity3D热更新全书-重头再来

    之前写了Unity3D热更新全书系列Blog 提出了下载.加载.脚本三个方面的开源类库 下载方面有EasyDown加载方面有GameObjParser脚本方面有C#Light另外有一个没有独立成库,但 ...

  4. Unity3D热更新全书FAQ

    只要有程序员朋友们问过两次的问题 就会收录在此FAQ中 1.C#Light对比LUA有什么好处 C#Light是静态类型脚本语言,语法同C#,Lua是动态类型脚本语言,这两种都有人喜欢. 我更喜欢静态 ...

  5. Unity3D热更新全书-何谓热更新,为何热更新,如何热更新

    首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就 ...

  6. Unity3D热更新全书-下载 唯一的一篇

    下载在这个时代实在是太平常了,每个人都深刻的理解着下载到底是什么. 这一篇文字只是把下载的代码分享并介绍,而已. 首先,下载系统担负着几个使命. 第一.是保持客户端版本库的最新. 第二.是下载要能够比 ...

  7. Unity3D热更新全书-脚本(四) 用C#LightEvil搭建实际开发使用的脚本框架

    C#LightEvil之前提供了很多和Unity结合的例子,都是采用把脚本文件放置在StreamingAssets中的方法. 这样可以利用Unity的特性,放在这个目录中的CS文件会被编译器编译,我们 ...

  8. Unity3D热更新全书-脚本(二) 两级分化

    上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...

  9. 热更新--动态加载framework

    1.准备工作:先自己封装一个framework:http://www.cnblogs.com/sunjianfei/p/5781863.html 2.把封装好的framework压缩成zip,放到本地 ...

随机推荐

  1. cassandra安装

    从官网下载下来的包解压后有100多M,里面包含了已经编译好的全部程序. 按照方法,进入目录后运行 bin/cassandra -f 运行不成功. 然后根据"https://wiki.apac ...

  2. 从0到1搭建移动App功能自动化测试平台(2):操作iOS应用的控件

    转自:http://debugtalk.com/post/build-app-automated-test-platform-from-0-to-1-Appium-interrogate-iOS-UI ...

  3. C#中的using和yield return混合使用

    最近写代码为了为了省事儿用了几个yield return,因为我不想New一个List<T>或者T[]对象再往里放元素,就直接返回IEnumerable<T>了.我的代码里还有 ...

  4. 替换CENTOS自带的yum源为网易163镜像源

    首先确保你的系统是centos5或者centos6   先备份你系统自带的repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cent ...

  5. C#中的BackgroundWorker控件+Delegate.Invoke (委托同步调用)

    C#中的BackgroundWorker控件+Delegate.Invoke (委托同步调用) 简单代码,记录一下.一个BackgroundWorker控件  backgroundWorkerRefr ...

  6. jsQunit

    1:什么是单元测试? 1.1:单元测试又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.单元测试主要是用来检验程式的内部逻辑,也称为个体测试.结构测试或逻辑驱动测试.通常 ...

  7. VS非web项目使用Transformation配置文件

    Web项目中的Transformation使用起来非常方便,特别是本地与服务器情况不一致时调试下以及webdeploy的配合使用. 步骤: 1. 在项目中新建App.Debug.Config及App. ...

  8. [转]彻底征服Word 2007标题多级列表

    [转]彻底征服Word 2007标题多级列表 用Word编写文档的人都知道,一篇长文档一般是需要分章节来划分段落的.在Word中也有对应的工具来完成这项任务,这就是多级列表.然而绝大多数使用Micro ...

  9. javascript基础知识-函数

    1.javascript中函数有两种定义方式: 函数语句定义和表达式定义 //函数有定义 function test(){ console.log("This is a function&q ...

  10. C#与C++的区别!

    (1) 编译目标:C++代码经常编译成汇编语言.而C#则编译成中间语言(IL)它与Java的字节代码有些相似.IL随后在通过Iust-In-Time编译进程转换成本机的可执行代码.IL代码将作为一个装 ...