AssetBundle

Unity教程之-Unity5.x版本AssetBundle加载研究

 

之前说了 “unity4.x版本AssetBundle打包研究”,没看过的请先看一下《Unity教程之-Unity3d打包Assetbundle并加载》,再来看本文,有一定的连接性。

先梳理一下思路:
要加载一个资源A,必须先去加载它的所有依赖资源
要知道这个资源A依赖了哪些资源,必须先去加载AssetBundleManifest
通过AssetBundleManifest对象的GetAllDependencies(A)方法,获取它依赖的所有资源。
依赖资源都加载了,就可以去真正加载资源A了。 More

Unity教程之-使用AssetBundle和Xml实现场景的动态加载

 

今天我想和大家聊聊在Unity3D中关于场景的动态加载的问题。众所周知在Unity3D游戏开发过程中,因为受到游戏容量、平台性能和热更新等诸多因素的限制,我们可能无法将所有的游戏场景打包到项目中然后相对”静态”地加载,那么这个时候就需要我们使用动态加载的方式来将游戏场景加载到场景中。博主在研究了Unity3D动态加载的相关资料后发现,目前Unity3D中实现动态加载场景的方式主要有以下两种方式: More

Unity3D热更新全书-Script脚本篇(三):C#LightEvil语法与调试

 

继续上片文章《Unity3D热更新全书-Script脚本篇(二): 两级分化》,本篇文章我们来学习下C#LightEvil语法与调试下面开始!

调试,这是一个无法规避的问题

C#Light 由于有 词法解释、语法解释、运行时三种情况

所以和C#也是有类似的问题

出错大致可以分为编译错误和运行时错误

拼写出莫名的东西或者语法不正确,会在编译阶段报错,这种错误很好检查,因为

C#Light语法是C#的严格子集,所有的C#Light脚本都可以用C#的标准做语法检查 More

Unity3D热更新全书-Script脚本篇(二): 两级分化

 

上篇《Unity3D热更新全书-Script脚本篇(一): 初识脚本》明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行。

可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同的复杂度脚本将表现出完全不同的样貌,我们来看一下。

我们把脚本与程序的结合方式划分成五种,以复杂度排序说明。

C#Light是定位复杂度较低的脚本,C#Evil是定位复杂度较高的脚本,他们就在脚本定位的两级,可是有相当复用部分的代码,所以他们被合并成一个项目,你可以从GitHub上取得他们的源码。

代码获取及文中示例的位置,在文后说明。

简言之,脚本可以两级分化成两种:

程序调用脚本,脚本为程序提供灵活性

脚本调用程序,程序为脚本提供扩展性

究竟是极左还是极右,怎么使用,是你的自由。 More

Unity3D热更新全书-Script脚本篇(一): 初识脚本

 

开篇之前还是要先说明,这是一份给经验并不丰富的程序员阅读的文字。

有需求、有疑惑,往下看。

第一个问题什么是脚本?程序和脚本如何区分?我们给Unity编写的组件是程序还是脚本?

这些问题本文无意去解答,因为其中混合着太多有立场的东西,站在不同的立场会有不同的看法,这其中的矛盾不是简单可以调和的。

只要提出一个观点,就很容易陷入语言大战的泥潭。

我们不妨从另一个角度来思考,为什么要分程序和脚本,是为了找一条分界线。

这条分界线叫做灵活。

我们这个专题的出发点是探讨Unity3D客户端资源更新,已这个出发点划条线,不灵活的站左边,灵活的站右边。

More

Unity3d热更新全书-资源加载(二):不用AssetBundle的前提下动态加载prefab预设

 

本篇文章我们继续来探讨unity3d热更新,如何在不使用AssetBundle的前提下动态加载prefab预设,下面开始!

Unity3D的主要构成大家都知道,首先是场景图,场景图上的节点构成一颗树。

每个节点对应一个GameObject对象

然后每个GameObject有若干个组件

有一些组件会与资源产生关系,比如MeshRenderer会关联材质,材质会关联shader和贴图

场景图的一部分可以被保存为一个预设prefab。

有时候我们会需要用预设去复用,而预设的加载似乎只能通过AssetBundle去打包,其实不然,这里我们有一个开源的库就可以解决这个问题。 More

Unity3d热更新全书-资源加载(一):从AssetBundle说起

 

本篇unity3d教程我们来继续探讨unity热更新全书,先从资源加载说起,Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle.

我们也来说说AssetBundle

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

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

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

3.WWW 从网络下载并加载

4.WWW 从网络加载AssetBundle

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

Unity教程之-AssetBundle共享资源打包与依赖资源打包

 

本篇unity3d教程我们来学习下AssetBundle共享资源打包与依赖资源打包,关于AssetBundle依赖资源打包,我们可以把对象相关的引用都打包在一起,比如对象的材质、图片、网格mesh等,但是这种AssetBundle依赖资源打包有一个很大的缺点就是浪费资源同时也不利于我们游戏性能优化,而AssetBundle共享资源打包,就是把相同的资源打包在一起,比如相同的材质material、图片打包在一起,这样对于提升游戏性能还是很有帮助的,当然采用AssetBundle共享资源打包,在我们资源AssetBundle加载的时候是需要设定好顺序的,关于共享资源打包的代码,其实这一块很简单,就两个函数:

BuildPipeline.PushAssetDependencies():依赖资源压栈;

BuildPipeline.PopAssetDependencies():依赖资源出栈。

直接看代码,下面为打包示例代码,Prefab1和Prefab2共享贴图资源Tex1,在打包时将Tex1单独打包,而Prefab1和Prefab2对应的assetbundle包中不实际包含Tex1资源,而是记录Tex1资源的引用: More

Unity教程之-Unity3d资源管理

 

一直没有总结过Unity的资源管理,都是随用随看文档。今天有人问,竟然没说上来,说起来也做了两款Unity游戏,惭愧。这里总结一下,加深自己对Unity资源管理的理解。主要参考了Unity官方文档之Resources和AssetBundle。

Unity有两种动态加载资源的方式,Resources.Load和AssetBundle。Resources.Load用于加载打进游戏包内Resources目录下的资源,AssetBundle用于加载包外自己打的资源包(使用BuildPipeline.BuildAssetBundle),常用于做动态更新。下面结合API具体说明:

加载:

Resources.Load:加载app包内Resources/目录的一个asset;

Resources.LoadAsync:Resources.Load的异步方法;

Resources.LoadAll:类似Resources.Load,但是用于加载某目录下所有asset;

Resources.LoadAssetAtPath:加载Asset/目录下的资源,只能用于编辑器模式,写打包工具时可能用到;

AssetBundle.CreateFromFile:从磁盘加载一个AssetBundle,这是加载AssetBundle最快的方式(我查到有人说这种方式只能用于pc,官方文档没提有这个限制,待检验); More

Unity教程之-Unity中WWW加载AssetBundle(二)

 

上篇文章 Unity教程之-Unity3d打包Assetbundle并加载,这篇我们来学习下利用FileStream在读取我们的AssetBundle数据文件,并解决unity WWW中文路径问题。下面开始,因为FileStream是允许中文路径的,可以先通过文件流把AssetBundle读取到内存,在通过CreateFromMemory 创建AssetBundle资源,这样的话就避开了WWW不能加载中文路径的问题。贴上代码 More