unity ngui下载5.x ngui 还能用assestbundle么

程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之Assetbundle的原理(六十一)
Unity3D研究院之Assetbundle的原理(六十一)
围观107929次
编辑日期: 字体:
Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利。
Assetbundle可以将Prefab封装起来,这是多么方便啊! 而且我也强烈建议大家将Prefab封装成Assetbundle,因为Prefab可以将游戏对象身上带的游戏游戏组件、游戏脚本、材质都封装在一起。当从服务器上将Assetbundle下载以后直接Instantiate就可以放入游戏中。
试想一下,如果只能将原始的二进制资源文件放在服务器上下载,当资源文件下载完毕后,需要动态的创建游戏对象、然后动态的将脚本绑定在游戏对象、动态的将贴图赋予游戏对象等等各种动态的操作。。所以强烈建议使用Prefa,不解释!!!!!
另外,我在举个例子,因为模型有可能会带很多动画文件,那么这样一组模型资源就可能是多个FBX 文件 和 若干png贴图文件 材质文件。这时我只需要把原始模型放入Prefab中,它就会包含这个模型的所有组件、甚至包括它的动画资源、贴图。那么如下图所示,Mode就是模型的Prefab文件,那么我仅仅只需要把Mode这个预设打包成Assetbundle即可。 当我在服务器上下载这个Assetbundle并且载入游戏中就可以直接使用了,切换动画、换贴图都可以。。
2.二进制文件
也并不是Assetbundle中全都要用预设,Assetbundle它也可以将二进制文件直接封装在里面,比如图片、声音、文本信息等等。
3.场景文件
在Unity中可以将一个场景保存在Scene中,Scene就会包含这个场景中的所有,那能不能把Scene也封装成Assetbundle中?答案是能,但是它不能在移动平台上用,因为移动平台上是不能更新脚本的,换句话来说就是即使将脚本绑定在Prefab中,然后下载Assetbundle后,所有脚本是不会执行的,后面说另外一种巧妙用法。
4.移动平台
上面MOMO已经将Assetbundle 的使用原理大致介绍了一下 ,我们在谈谈移动平台。脚本不能更新是移动平台下最大的伤,这就意味着开发者无法绕过App store和 google Play这种在线商店升级应用程序。唯一能做到的就是更新资源、举个例子,游戏中在处理版本升级时,一般会有个大版本号和一个小版本号,大版本号就是 2.0、3.0这种 版本需要在AppStore中更新,大版本主要是升级游戏脚本,然后当小版本号,比如2.0.1 或2.0.2这种只是更新游戏中的资源,通过自己游戏的服务器就可以完成,通过Assetbundle在自己服务器上下载,然后适应在游戏中。如果非要更新脚本,或不得不更新脚本那么只能在Appstore或者google Play去更新大版本。
移动平台上不能更新脚本,那么Prefab上绑定的脚本怎么办?在任何平台上都可以把脚本添加到Prefab上,然后打包成Assetbundle,只有移动平台上有点特殊,比如将Test.cs这条脚本绑定在Prefab中,最后程序通过服务器下载这个Assetbundle ,当载入工程中这条脚本是不会被执行的。
但是如果本地工程有Test.cs这条脚本,那么Unity会自动将这条脚本绑定在下载的Prefab中,并且他们执行的非常好。如果本地工程中没有Test.cs这条脚本,那么Prefab上的脚本是永远都不会执行的。有时我们会在脚本中写一些Public的变量,有可能不同的Prefab上绑定的是相同的脚本,只是Inspector 脚本中的public参数不同。别担心这一点Assetbundle 中的Prefab也是没问题,所以说只要大版本中的脚本没问题,在小版本中只更新游戏资源是一点问题都么有的。
5.移动优化
之前我们说过可以将游戏中的某个游戏对象封装成Assetbundle,也可以将游戏中的整个场景也封装成Assetbundle。但是我认为需要巧妙的使用封装场景,因为场景中肯定有很多公用的模型,如果打包场景的话那么内存与size就是 公用模型的size * N个场景,想想其实挺恐怖的。其实我们可以巧妙的使用,首先把场景中公用的部分和私有的部分统统放入Unity, 然后烘培整个场景。 当场景烘培完毕后把公用的模型部分在拿出去,场景只只保留私有的模型。还可以做一个工具将公用模型在场景中的坐标保存在XML中(每个场景文件会对应一个公用模型的XML信息),最后在将公用的模型分别封装在别的Assetbundle中。
服务器上提供每个场景的Assetbundle ,和公用模型的Assetbundle,一般公用模型的Assetbundle可以放在常驻内存中(可能使用频繁、根据项目的不同而定)场景Assetbundle下载完毕后,现载入场景然后在根据场景对应的XML信息将公用模型部分动态的在添加到场景中,这样就完成了一个场景的构建。
对游戏中所有资源进行打包,比如按类型分为五个大部分
界面,模型,特效,声音,场景,脚本。
界面部分:
公用资源包(可复用的资源包)和 每个界面独有得资源包(不可复用的资源包)统一使用Prefab 打包成.assetbundle 二进制格式。
模型部分:
按角色分类,统一使用Prefab 打包成.assetbundle 二进制格式。 模型部分包括模型文件与动画文件,每一个模型文件对应一组动画文件。(如果模型需要换装还需提供对应换装的模型与贴图) ,因为unity4的重定向动画不支持动态加载,所以目前不需要考虑 不同大小 不同规格 不同性别 的模型重定向动画。
特效部分: 统一使用Prefab 打包成.assetbundle 二进制格式。
声音部分: 统一使用Prefab 打包成.assetbundle 二进制格式。
场景部分:场景和前面的有点区别,场景需要导出烘培的光信息并且只能烘培场景之上永远不动的模型,但是这些永远不动的模型有可能会同时在多个场景中使用,所以场景烘培完毕后要把重复使用的对象删除,(运行游戏在动态的加载进来)场景中只保留该场景中永远不会变的模型,以及烘培的光照信息。 打包场景后会生成.unity3D 二进制格式,它和 assetbundle 打包方式是不同的。(另外,也可以考虑 json xml 二进制 来动态组装场景)。
脚本部分:如果Prefab上是带脚本打包Assetbundle的话
脚本是不会被运行的(移动平台), 但是unity有一个技巧,Prefab上的脚本 如果本地有的话它会把本地的同名脚本绑定在Prefab对象上,它会很好的执行。
Prefab打包技巧: Prefab打包时自身是不占多少空间的 &=1KB
但是Prefab上是可以关联
这五大部分 “界面,模型,特效,声音,场景,脚本”以及在Hierarchy视图中 坐标/缩放/旋转。 关联这些信息以后就会很大,所以为了避免资源的浪费尽量避免Prefab重复关联。
一个prefab下面可以同时关联多个游戏对象 ,这里举个例子如果你的 Prefab下面放了一个模型 它的大小可能是500k
,在 Prefab下面放了十个完全相同模型 它的大小可能是501k 。 如果Prefab下面放了两个不同的模型,它的大小可能就会是 500k x 2 的size
,也就是说Prefab与关联的数量是无关的 。
加密部分: assetbundle 是可以转换成 字节数组 ,客户端与服务器约定一组解密 字节数组的算法就可以实现资源加密。
大版本升级:
unity的版本升级其实主要是升级主程序中的脚本。 因为所有的资源都是assetbundle 和 .unity3d
这些资源放在本地或者服务器 解包的方式是完全一样,所以理论上我们的主程序包的大小可以做到很小,可以很好设置把多少资源放在包里 或者把所少资源放在服务器上。在运行的时候服务端应该把所有 assetbundle 和 .unity3d的资源文件的下载地址列表返回给客户端。
小版本升级:
小版本升级也就是更新资源,因为不能更新脚本, 在登陆的时候服务端应该把所有 assetbundle 和 .unity3d的资源文件的下载地址列表返回给客户端。
还有个需要考虑的地方,比如现在大版本是2.0.0 ,小版本已经是2.0.5 ,用户的手机上是一个1.5.0的包。 此时用户在打开游戏的时候 应当强制它去appstore中去下载大版本2.0.0 ,当用户下载完毕后登陆游戏,此时服务器告诉客户端现在已经是2.0.5的小版本了,这时候客户端去下载对应小版本的所有
assetbundle 和 .unity3d文件地址列表。
增量更新:理论上增量更新是可行的。因为unity不能更新脚本,所以在处理增量更新的话 需要在代码中做可以兼容增量更新的可能。
因为Assetbundle这块的代码比较多,我还是决定分成两篇文章来写,这篇文章先说原理、下篇文章说代码。欢迎大家来讨论!
前几天我和Unity鑫哥聊天,他告诉我IOS上是无法运行时更新脚本、但是Android上是可以运行时更新脚本,我回家也试了一下但是没能成功,后来我考虑即使成功了项目中我也不打算那么做,因为这样Android和IOS 做起来的差别就太多了, 另外Unity商店中有一个处理运行时更新脚本的插件 unityLua 大家可以去研究研究。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!unity-AssetBundles(6)
之前曾经写了一篇博客介绍Unity5的AssetBundle,结果似乎很受关注。不过似乎很多人看了之后都不懂,主要是因为不太明白AssetBundle是什么,它的依赖关系和结构是什么的,就直接想拿代码去用,而导致了很多人说看不懂啊,说什么有错误啊,诸如此类。我想了一下,还是应该从最基础的东西说起,不厌其烦的说,才会省去大家加我QQ问问题了,毕竟平时上班忙,看到一些人把我当翻译词典查,我肯定会态度不好的。
一、什么是AssetBundle
估计很多人只知道Unity的模型之类的东西可以导出成一种叫做AssetBundle的文件,然后打包后可以在Unity程序运行的时候再加载回来用。
那么AssetBundle是一个什么样的东西呢?其实AssetBundle只是一种使用LZMA压缩方式压缩的资源文件。具体LZMA是什么请百度,你可以理解成就是一种压缩文件就行了,至于它的后缀名是什么,一点关系都没有,你可以自己定。
AssetBundle打包的时候,你可以指定一个mainAsset,那么加载完之后就可以通过AssetBundle.mainAsset来获取到了。你也可以不指定mainAsset,直接打包一堆内容进去,然后加载后通过AssetBundle.LoadAsset指定名字的读取出来。
在资源之间,存在着依赖的关系。你可以把资源拆分得很细,比如一个模型,由网格模型、材质、贴图构成,你可以把每一个小部分都拆开,各自打包成压缩文件。当Unity需要加载使用的时候,把该模型的所有依赖的小资源都加载起来,然后根据依赖关系组装,就变回了我们看到的资源了。
二、AssetBundle的依赖结构
要说明依赖关系结构,我们还是使用上面的例子,一个模型,分为了网格模型、材质、贴图。那么他们是怎样依赖的呢?然后在Unity5的打包里面,他们是怎样表现出依赖关系的呢?
接下来做一个小小的实验:
我准备了4张贴图,分别叫做t1、t2、t3、t4,然后建立了两个材质球,分别是m1、m2,m1材质使用了t1、t2、t3三张贴图,m2材质使用了t4贴图。
最后建立两个模型,我就使用unity内置的模型了。obj1是一个cube,obj2是一个quad。obj1使用了m1材质,obj2使用了m2材质。然后obj1和obj2都做成了预设,放在了Assets/Resources/Obj/下面
那么现在他们的结构应该是这样的:
接下来,先只设置obj1的assetBundleName,然后导出
导出之后,我们看看AssetBundle.manifest
里面只有一个Info,就是刚才我们命名的obj1.ab,而obj1.ab下面的Dependencies是空的,也就是它没有任何依赖了。
再看看obj1.ab.manifest
&它里面包含了类型的哈希码、Assets资源的路径,和依赖。这里它的依赖还是空的。
接下来把obj2也赋予AssetBundleName:
再导出,会发现除了刚才的文件以外,会多了2个文件,就是obj2.ab和obj2.ab.manifest。
还是打开AssetBundle.manifest看看,会发现
这次的Info变成了2个,分别是obj1.ab和obj2.ab
打开obj1.ab.manifest
发现和刚才没什么变化。
再看看obj2.ab.manifest
&它的结构和obj1.ab.manifest差不多。
刚才只是把2个模型设置了导出AssetBundle,接下来我会把两个材质和四张贴图都设置导出
不厌其烦的把图贴上来:
这时候导出,我们的所有依赖关系都应该存在了。导出之后,多了很多文件,是这样的:
再来看AssetBundle.manifest
&这次看到的Info有7个了,其实我们设置了多少个AssetBundleName导出,它就应该有多少个Info。
看obj1.ab.manifest
&这次看到它的Dependencies,会看到有依赖了,写的是一个本地的地址。有人会说,这个绝对路径有问题啊,我把这个文件放到cdn上面,路径就会不对啊。这个先不急,下面会说明是什么回事。
看m1.ab.manifest
会发现结构差不多,但依赖列表里面会有三个地址,就是我们三张贴图的地址了。
看obj2.ab.manifest 和 m2.ab.manifest情况会差不多
接下来,要做最后一步试验了,比如刚才我已经是整个项目的导出了,现在我突然需要改动其中的一个小部分,现在我就把t4不导出了。
那么现在我们再整个项目的AssetBundle导出,会怎样?
导出完之后,看目录,会发现文件和刚才是一样多的,t4.ab并没有被删掉。
再看AssetBundle.manifest
Info变成6个了,而里面某些项的依赖列表变了
看obj1.ab.manifest
&和刚才没有变化
看obj2.ab.manifest
&和刚才也是没有变化的
看m2.ab.manifest
&这里的依赖列表没有了。
这其实就是AssetBundle的链式结构和增量打包了。一个小的部分改变了,它将会改变的地方只有总的AssetBundle.manifest,还有直接依赖于它本身的manifest。其他不依赖的部分是不需要重新打包的。
还有一点需要注意的地方是,除了manifest文件以外,还有一个没有后缀名称的AssetBundle文件。这个文件其实才是包含了所有的依赖关系的总的依赖关系配置文件,刚才我们能用txt打开的manifest文件,都只是用来做本地依赖关系和增量打包的时候用的。我们加载AssetBundle的时候,完全不需要加载那些manifest文件的,只需要那个没有后缀名称的AssetBundle文件就行了,它代表的是该项目的所有AssetBundle的依赖关系。
所以,刚才我们看到manifest里面用的都是本地的绝对路径,那是针对你本地打包时用的,和加载无关。&
三、导出AssetBundle和自动设置名称
刚才我们都是直接的输入AssetBundleName来导出AssetBundle的,其实这一步可以使用代码自动完成
在Unity项目内部,每一个小的资源(网格、材质、贴图、声音等),都会有一个唯一的哈希Id的,是一串很长的字母和数字组合。我们可以通过AssetDatabase.AssetPathToGUID来获得这个ID。
那么自动设置就变得简单了,可以通过以下的代码,我们可以设置一个总的prefab的AssetBundleName,然后自动获得它身上的所有依赖,然后获得每个依赖资源的唯一Id,再赋予AssetBundleName就行了
四、加载AssetBundle的步骤
通过上面导出AssetBundle的说明,估计现在想要把它加载起来就变得简单了。
首先需要明白一个规则,资源的依赖关系组装是unity本身会自动完成的。比如一个资源A,它是依赖于资源B和资源C的,那么如果我们需要加载资源A进来并正确的显示出来,我们必须先把资源B和资源C加载,然后再加载资源A。当资源A加载进来之后,发现内存里面已经有资源B和资源C了,它会自动的组装起来。
那么再看看加载的步骤了:
1、获得总的依赖配置
刚才已经说明了,真的有用的依赖配置文件是没有后缀名称的AssetBundle文件,所以我们需要加载的就是这个文件了。
string mUrl = Cdn + &AssetBundle&;
然后www加载。
之后很多人看不懂,说我这个Cdn是什么东西,“AssetBundle”又是什么东西,现在应该明白了吧?Cdn就是你的资源服务器路径,“AssetBundle”就是文件名,它没有后缀。
加载后,通过AssetBundle.LoadAsset(&AssetBundleManifest&),就可以把刚才那个没有后缀名的文件转成AssetBundleManifest对象mainfest。
2、根据名称找到目标加载资源的所有依赖
获得了AssetBundleManifest对象mainfest之后,比如我们实际上是需要加载obj1.ab的,这在刚才的AssetBundle.manifest里面可以知道,它的Info里面就有obj1.ab。然后我们通过
string[] dps = mainfest.GetAllDependencies(&obj1.ab&);
就可以获取到obj1.ab的所有依赖了,包括了子依赖,比如它依赖于m1.ab,然后m1.ab依赖于t1.ab、t2.ab、t3.ab,那么这里获取到的就应该是4个依赖了。分别是m1.ab、t1.ab、t2.ab、t3.ab。
3、加载所有依赖的资源
获取到obj1.ab的所有依赖之后,就应该逐个的去加载他们了。分别www加载他们,然后保存他们的AssetBundle。
4、加载目标加载资源
当加载了所有的依赖资源之后,就可以光明正大 的去加载目标资源了,这里我们的目标资源就是obj1.ab。
5、实例化显示
obj1.ab加载完之后,你爱怎样用都可以,直接实例化出来吧。
由于AssetBundle是不能重复加载的,如果你需要多次加载一个资源,你有2个选择,要么加载了就Unload(false)卸载了它。要么你可以把它存起来,当需要相同名字的AssetBundle的时候,直接取出来。
五、最后的建议
1、Unity5的新版AssetBundle好像是一套全新的系统,其实和旧系统的差别并没有很大,只是自动生成了依赖配置文件而已。这一个步骤实际上完全可以自己实现的,那些配置文件可以用自己喜欢的格式生成,然后加载的时候再自己想办法把依赖关系找回来就行了。
2、个人觉得把AssetBundle拆得太碎并不是一件好事情。为什么这么说呢?用过电脑的人都知道,拷贝文件的时候是一个个碎的文件拷贝快?还是把一堆文件压缩成一个包,然后拷贝快?如果加载一个模型,需要分别加载十几次依赖资源,才能显示,这个过程中发送这么多的www或者http请求,过程有点危险。至于说冗余文件的问题,自己考虑一下分布策略吧。
2、一般来说,这种东西都需要配合着一套资源管理的系统来用的,所以在上一篇博客里面,我只是介绍新AssetBundle的特性,不太可能整一套系统都搬出来,只写了几句有代表性的关键方法当做伪代码来说明
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:130次
排名:千里之外
转载:10篇18541人阅读
【Unity】(97)
【资源加载】(6)
首先要说的是,我们的工程中有2个脚本,分别是:Build(编辑器类脚本,无需挂载到任何物体),但是必须要把Build脚本放到Editor文件夹中Load脚本,挂载到摄像机上&pre name=&code& class=&csharp&&using UnityE
using System.C
using UnityE
public class Build : MonoBehaviour
// 编辑器类
[MenuItem(&Build/BuildAsset&)]
// 打包单个资源的方法
static void BuildAsset ()
// 将物体打包到/AssetsBundles路径下同时命名为Cube1.assetbundle
string targetPath = Application.dataPath + &/AssetsBundles/Cube1.assetbundle&;
// BuildPipeline 打包用 Selection (Selection.activeObject 在编辑器中选中的对象)
// 第二个参数null,是打包多个资源的时候用的,多个资源就是数组,单个资源的时候这个参数不用写
// 第三个参数是路径,你想把这个资源放到什么位置就写什么,并且还要命名为.assetbundl格式
BuildPipeline.BuildAssetBundle (Selection.activeObject, null, targetPath);
// 刷新资源,直接可以在unity中看到刚才打包的东西
AssetDatabase.Refresh();
// --------------------------------------------------------------------------------
[MenuItem(&Build/BuildMultiAsset&)]
// 打包多个资源的时候使用这个方法
static void BuildMultiAsset()
// 将物体打包到/AssetsBundles路径下同时命名为Cubes.assetbundle
string target = Application.dataPath + &/AssetsBundles/Cubes.assetbundle&;
// 因为打包多个游戏对象,所以是一个数组,typr(Object)表示,只要选择的物体是Object类型就可以
// 并且选择的模式是深度资源搜索(具体学名到底叫啥我也忘了。。。),
// 意思是只要你选择的object对象下面如果还有关联的东西就都会一起打包(unity导出场景的时候应该可以感受到)
Object[] cubes = Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);
// 打包开始,因为是一堆资源,所以主资源为null,剩下两个参数意思同上
BuildPipeline.BuildAssetBundle(null,cubes,target);
// 刷新资源,直接可以在unity中看到刚才打包的东西
AssetDatabase.Refresh();
// --------------------------------------------------------------------------------
[MenuItem(&Build/BuildScene&)]
// 打包场景的方法
static void BuildScene()
// 场景名字,为什么是数组呢(因为参数里要求这个参数是数组类型。。。。)
string [] sceneName =
new string[]{Application.dataPath + &/scene1.unity&};
// 将物体打包到/AssetsBundles路径下同时命名为Scene1.assetbundle
string targetPath = Application.dataPath + &/AssetsBundles/Scene1.assetbundle&;
// 注意打包的方法名已经变成流类型了,后面的最后一个参数表示你要在上面平台运行
// iphone平台就是用BuildTarget.iPhone这个参数
// 安卓平台就是用BuildTarget.Android这个参数
// 类似参数可以自己查看。。。
BuildPipeline.BuildStreamedSceneAssetBundle(sceneName,targetPath,BuildTarget.WebPlayer);
// 刷新资源,直接可以在unity中看到刚才打包的东西
AssetDatabase.Refresh();
// --------------------------------------------------------------------------------
[MenuItem(&Build/BuildDependence&)]
static void BuildDependence()
// 对一些公共参数的定义 //
// 定义路径文件夹是Application.dataPath读取后的路径 加上 &/AssetBundles&
string path = Application.dataPath + &/AssetsBundles&;
// 定义资源包的依赖关系选项
BuildAssetBundleOptions buildOp = BuildAssetBundleOptions.CollectDependencies | pleteA
// ---------------------------------------------------------------------
// Push和Pop是成对出现的,他们的作用是维持一个依赖关系
// 我们当前的资源包关系是这样的:
Tex1.assetbundle资源包(Tex1的包里有以下2个资源包)
c1.assetbundle资源包(c1和c2是平级关系)
c2.assetbundle资源包
//依赖资源压栈
BuildPipeline.PushAssetDependencies();
// 替代之前的selection的手动选择方式
Object tex = AssetDatabase.LoadMainAssetAtPath(&Assets/Resources/Tex1.jpg&);
// 所有后续资源将共享这一资源包中的内容,但是你要保证的是,在使用c1和c2这种内层依赖包时
// 你已经加载了最外层资源包Tex1
BuildPipeline.BuildAssetBundle(tex, null,path + &/Tex1.assetbundle&, buildOp);
// 这里使用一对Push和Pop是将我们接下来加载的c1资源包和tex依赖起来
BuildPipeline.PushAssetDependencies();
Object c1 = AssetDatabase.LoadMainAssetAtPath(&Assets/Resources/Cube1.prefab&);
BuildPipeline.BuildAssetBundle(c1, null, path + &/c1.assetbundle&, buildOp);
BuildPipeline.PopAssetDependencies();
BuildPipeline.PushAssetDependencies();
Object c2 = AssetDatabase.LoadMainAssetAtPath(&Assets/Resources/Cube2.prefab&);
BuildPipeline.BuildAssetBundle(c2, null,path + &/c2.assetbundle&, buildOp);
BuildPipeline.PopAssetDependencies();
// 依赖资源出栈
BuildPipeline.PopAssetDependencies();
AssetDatabase.Refresh();
using UnityE
using System.C
public class Load : MonoBehaviour {
// 所有公共的路径名开头都是这个文件夹,所以单列出来,简化后面代码
public static string loadPath
= &file://& + Application.dataPath +&/AssetsBundles&;
// 画一个按钮
void OnGUI()
if(GUILayout.Button(&LoadTex&))
StartCoroutine(LoadTex(loadPath));
if (GUILayout.Button(&LoadCube&)) {
// 因为下面的方法都是协同程序,所以需要手动开启协同程序
StartCoroutine(LoadCube(loadPath));
if (GUILayout.Button(&LoadVersion&)) {
StartCoroutine(LoadVersion(loadPath));
if (GUILayout.Button(&LoadCubes&)) {
StartCoroutine(LoadCubes(loadPath));
if (GUILayout.Button(&LoadScene&)) {
StartCoroutine(LoadScene(loadPath));
// 协同方法,加载1个cube的方法
IEnumerator LoadCube (string path)
// 下载一个已经打包好的assetbundle(打包需要在Build脚本中实现,在工程里手动打包)
WWW www = new WWW(path + &/Cube1.assetbundle&);
// 返回下载的assetbundle包
// 实例化一个cube,游戏物体使用assetbundle中的主资源(因为是单独打包,所以只有一个主资源),后面是实例化物体的位置和角度信息
Instantiate(www.assetBundle.mainAsset,new Vector3(Random.Range(0,9),Random.Range(0,9),Random.Range(0,9)),Quaternion.identity);
// 实例化成功后输出资源名字
print(www.assetBundle.mainAsset);
// 卸载刚才已经下载的资源在内存中(就是在内存中删除)
www.assetBundle.Unload(false);
// 协同方法,加载多个cube的方法
IEnumerator LoadCubes(string path)
// 下载一个已经打包好的包含多个游戏对象的资源包
WWW www = new WWW(path + &/Cubes.assetbundle&);
// 下载资源包中的其中一个名字叫Cube1的物体(这个名字一定是在刚才下载的那个包里有的)
Instantiate(www.assetBundle.Load(&Cube1&),Vector3.up,Quaternion.identity);
// 下载资源包中的其中一个名字叫Cube2的物体(这个名字一定是在刚才下载的那个包里有的)
Instantiate(www.assetBundle.Load(&Cube2&),Vector3.up,Quaternion.identity);
// 协同方法,加载一个场景的方法
IEnumerator LoadScene(string path)
// 下载已经打包好的场景
WWW www = new WWW(path + &/scene1.assetbundle&);
// 获取到包含场景的assetbundle资源包
AssetBundle bundle = www.assetB
// 加载的是资源包中的scene1场景,如果没有上面的这行代码,就无法加载这个场景
Application.LoadLevel(&scene1&);
IEnumerator LoadVersion(string path)
// 根据版本号加载assetbundle
WWW www = WWW.LoadFromCacheOrDownload(path + &/Cube1.assetbundle&,1);
if (www.error != null) {
print(www.error);
Instantiate(www.assetBundle.mainAsset);
IEnumerator LoadTex(string path)
WWW www = new WWW(path + &/Tex1.assetbundle&);
WWW wwwc1 = new WWW(path + &/c1.assetbundle&);
print(www.assetBundle.mainAsset);
Instantiate(wwwc1.assetBundle.mainAsset);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:736206次
积分:16198
积分:16198
排名:第527名
原创:171篇
转载:12篇
评论:29条}

我要回帖

更多关于 unity ngui 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信