Unity5 怎样做资源管理和solr增量更新索引

Unity3D(150)
昨天一位朋友在我这里留言,想让我写点Unity5的AssetBundle心得。于是我就看了相关的介绍,和自己确切的做了一次。下面来谈谈所谓的心得。
如果你觉得自己对AssetBundle不熟悉,建议先看看另外一篇文章:
http://liweizhaolili./blog/static//
先来说说关于旧版本的AssetBundle的事情。
之前我写了一个批量导出AssetBundle的小插件,有朋友留言说我没有解决依赖关系。后来在一位同事的指导下,我终于把这个问题搞清楚了,其实说白了过程就是先扫描所有要打包的资源,然后用AssetDatabase.GetDependencies获得所有的依赖,自己记录起来,由于怕资源之间有重名的,所以最好用AssetDatabase.AssetPathToGUID获得资源的唯一id,然后存起来。获得了所有依赖关系之后,再使用BuildPipeline.PushAssetDependencies和BuildPipeline.PopAssetDependencies按照层级和顺序来打包。这样打出来的资源就完全的保留了依赖关系,文件也拆得很散很小,不会重复打包了。
在加载的时候,由于我们是预先记录了各个资源的依赖关系,所以在加载某一个资源的时候,先去保存的文件里面查找它的依赖关系,把所有用到的依赖资源都先加载一次,然后再加载它,就能完整的加载出一个想要的模型之类了。
这就是完整的旧版本AssetBundle依赖打包和加载的流程了。不过由于是受人指导学会的,所以不方便把全部代码贴出来。
再来看看5.0版本的心AssetBundle的使用情况:
看到新版本的AssetBundle,我那位同事估计会一口老血喷在屏幕上面。那是因为,这个辛辛苦苦做出来的打包策略,Unity已经集成了。
新版本的AssetBundle在打包的时候多了一个叫做BuildPipeline.BuildAssetBundles(outputPath)的方法,然后每一个资源可以设置一个assetBundleName。只要你调用这个方法,那么所有已经设置过assetBundleName的资源,就会自动打包,具体的好处有:
1、可以直接在编辑器UI上设置操作
2、提供了更简便的脚本API
3、Unity本身会处理所有的依赖关系
4、生成了一种叫做manifest的文件,用于记录资源之间的依赖关系,并以链式结构记录,修改时只需修改链的其中一环
5、增量打包功能。
以上的好处,是官方说明的,我大概操作了一下,说的都是事实,只是使用时有点需要注意的地方。
很明显的看出,这些优点,正是我那位同事已经做过的事情,和一些暂时没有做到的事情。
先来说说最多人关心的问题,Unity自己处理依赖关系。
实际上来说,所有需要打包成AssetBundle的资源,你是要先赋予它一个assetBundleName的,在它有了assetBundleName之后,实际上它的信息已经存在于AssetDataBase里面了。所以在打包的时候,只需要调用BuildPipeline.BuildAssetBundles方法,它会把记录了的在AssetDataBase里面的所有资源先计算出依赖关系,再拆分打包。这个步骤是一点问题都没有的。要注意的是,你所有依赖的资源都必须赋予assetBundleName,不然,依赖就不会被拆分。
在加载的时候,AssetBundle的特性是和旧版本一样的,就是当一个目标资源的依赖资源已经存在与内存中(也就是已经被加载过了),那么在加载目标资源的时候,Unity会自动的帮你找到依赖关系。所以在加载的时候实际上还是要你手动加载依赖资源的。这一点和旧版本一样。
再来说说打包工具的编写。
虽然官方说得很美好,一句BuildPipeline.BuildAssetBundles(outputPath)就可以直接把所有资源都打包了,而需要打包的资源可以在编辑器界面直接输入。但实际上由于上面说到的必须赋予每一个依赖资源assetBundleName,你不可能每一个资源去手动的查找用到的依赖资源再在编辑器输入名字,所以旧版本的打包流程还是要的。
首先,你可以遍历需要打包的文件夹,把所有需要打包的预设或者资源都找到,然后设置assetBundleName,然后,通过AssetDatabase.GetDependencies方法逐个找到资源的依赖资源路径,用AssetDatabase.AssetPathToGUID算出每个资源的唯一ID,然后将唯一ID当做assetBundleName赋予给每个依赖资源。最后,调用BuildPipeline.BuildAssetBundles(outputPath)打包到指定位置。
最后说说加载。
由于依赖关系都存在于manifest中,所以在加载资源之前,要先加载manifest文件。
实际上在打包的时候,会有一个总的manifest文件,叫做AssetBundle.manifest,然后每一个小的资源分别有一个自己的manifest文件。在我们加载的时候,需要先把总的AssetBundle加载进来。
比如这样:
& & & & string mUrl = Cdn + &AssetBundle&;
& & & & WWW mwww = WWW.LoadFromCacheOrDownload(mUrl, 0);
& & & & if (!string.IsNullOrEmpty(mwww.error))
& & & & & & Debug.Log(mwww.error);
& & & & else
& & & & & & AssetBundle mab = mwww.assetB
& & & & & & AssetBundleManifest mainfest = (AssetBundleManifest)mab.LoadAsset(&AssetBundleManifest&);
& & & & & & mab.Unload(false);
其中Cdn是我的资源路径,加载完之后,得到了一个AssetBundleManifest&对象。
然后根据我们需要加载的资源名称,获得所有依赖资源:
& & & & & & string[] dps = mainfest.GetAllDependencies(realName);
& & & & & & AssetBundle[] abs = new AssetBundle[dps.Length];
& & & & & & for (int i = 0; i & dps.L i++)
& & & & & & {
& & & & & & & & string dUrl = Cdn + dps[i];
& & & & & & & & WWW dwww = WWW.LoadFromCacheOrDownload(dUrl, mainfest.GetAssetBundleHash(dps[i]));
& & & & & & & &
& & & & & & & & abs[i] = dwww.assetB
& & & & & & }
其中realName是想加载的AssetBundle的名字,需要带扩展名。
通过了这一步,所有的依赖资源都加载完了,可以加载目标资源了:
&WWW www = WWW.LoadFromCacheOrDownload(url, mainfest.GetAssetBundleHash(realName+&.ab&), 0);
& & & & & &
& & & & & & if (!string.IsNullOrEmpty(www.error))
& & & & & & {
& & & & & & & & Debug.Log(www.error);
& & & & & & }
& & & & & & else
& & & & & & {
& & & & & & & & AssetBundle ab = www.assetB
& & & & & & & & GameObject gobj = ab.LoadAsset(realName) as GameO
& & & & & & & & if (gobj != null)
& & & & & & & & & & Instantiate(gobj);
& & & & & & & & ab.Unload(false);
& & & & & & }
& & & & & & foreach (AssetBundle ab in abs)
& & & & & & {
& & & & & & & & ab.Unload(false);
& & & & & & }
到这一步,所有的资源都加载完毕了。注意的是,记得Unload,不然下次就加不进来了。或者不Unload的话,就做一个字典记录所有加载过的AssetBundle,还有它们的引用计数器。那样就可以先判断是否存在在加载。
以上就是Unity5.0的AssetBundle的使用方法了。下面来吐槽一下。
1、看Unite2014大会的视频介绍时,感觉这个东西真好,提供了这么强大的功能和这么简单的API。但实际用过之后,发现整个打包和加载的过程其实和旧版差不多,真正有意义的功能,是manifest的链式结构,和增量打包功能。
2、我在没有使用之前,以为可以按照文件夹结构来打包,那样的话,就可以简单的从Resources.Load和外部WWW加载中做切换,只需要替换一个CDN地址就可以了。但实际上Unity把所有AssetBundle都打包在了同一个目录,在这个转换的过程中,我们还需要记录一下两者的对应关系。
3、资源打包的策略有时候和项目的设计本身有关,如果是阶段性很明确的资源管理,可能旧版的AssetBundle打包也不错。
4、现在只看了Unity5的AssetBundle觉得不错,但又看了一下其他功能,发现Unity5的很多功能都改了,这样的大改动对于旧项目来说有可能是影响非常大的,是不是值得为了新的AssetBundle而升级Unity,还是需要更多的评估。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:412901次
积分:5378
积分:5378
排名:第4959名
原创:68篇
转载:186篇
译文:37篇
评论:89条
(2)(1)(4)(22)(23)(13)(30)(2)(40)(11)(3)(3)(22)(33)(14)(21)(1)(1)(1)(6)(3)(34)(1)Unity开发IOS还是比较烦人的. 就算是用Mac也比较烦人.因为要生成xcode项目.而且你还需要在xcode里面接入sdk啥的. 所以非常的某乱. 经过洒家的研究.终于发现了一些生成项目的关心.也就说unity改了什么. 你转一个xcode项目.把新生成的 copy到旧的里面就可以更新程序了.
1. 如果修改了C#代码. 则需要Copy Classes目录下面的Native 到老的Xcode项目下就好了.原来的删除.则ok.
2. 如果修改了资源. 则需要Copy Data Libraries 这两个目录到老的Xcode项目下面.
也就说其他的文件可以不动. 这样就可以版本管理了.而不用每次都在新项目上面加了.
本文已收录于以下专栏:
相关文章推荐
最近尝试发布一下IOS项目,发现现在发布已经简单很多了,不需要开发者账户也能简单快捷进行真机调试。
本文学习怎么在unity里返回消息到iOS,现实功能(点击unity里面的按钮传递一个字符串到ios显示在消息对话框上,并且打开一个新的VeiwContoller)。言归正传
首先我们创建一个u...
Unity3d要想在ios上发布,必须要有开发者账号,如果要想在app store里发布,必须要花钱,这里我只是自己调试,只做学习用。
要在真机上调试,首先你必须要在mac上,用iphone连接mac...
以nibia为例的SDK接入总结
SDK接入主要是接第三方平台的登录和支付流程,以手机游戏为例,第三方平台就是国内较大的游戏中心和手机应用商店。
游戏商开发手机游戏的流程:
1、开发完...
对于一个不懂安卓不会java的新手程序,实现安卓三方登录开始是 一头雾水,不知道从哪下手,通过自己摸索加上多方求助终于完成了。为了自己巩固一下以及一些像我一样的新手走弯路,把详细过程记录下来。
●unity读取不到jar的assets目录,所以要手动用压缩工具打开jar包,把assets里面的文件都拷贝到unity项目的Android/assets目录下。
1、Q:接入易接sdk后发现充值成功没到账?
A:1)查看对应渠道后台是否配好了易接后台提供的回调地址
2)查看易接接入时的参数是否填对了(注...
(1)官方下载ShareSDK iOS 2.8.8,地址:/
(2)根据实际情况,引入相关的库,参考官方文档。
(3)在项目的AppDelegate中一般情...
前段时间,有些朋友问我关于支付宝接入手游的方法,大抵都是先把unity3d的工程导出到移动平台,然后再原生代码层面接入,我把流程步骤讲给朋友听,他觉得一头雾水,我想也是,这样挺麻烦的,所以我就试着把支...
在游戏开发完成后,最烦最累的活是什么?
----------------就是接入联运渠道SDK,为什么呢?
----------------第一,接入时要看文档,接入出现问题要问对方,如果对方...
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)unity5.x各种资源热更新策略的介绍阿赵_unity5.x各种资源热更新策略的介绍全文阅读_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
简介:从业十年以上的游戏技术人员,曾经担任游戏美工和程序员的岗位,熟悉3d模型制作、骨骼动画、三维渲染,熟悉...
计算机热门榜单
& 0手机专享价
扫码免费下载该书再送20元代金券
unity5.x各种资源热更新策略的介绍
目录(共7章)
投诉与建议
扫描下载客户端Unity5.x新的AssetBundle机制01——构建 - 简书
Unity5.x新的AssetBundle机制01——构建
unity_cover.png
Unity在5.0中推出了新的AssetBundle管理机制,本文将对此进行介绍并完成简单实践。
2什么是AssetBundles?
AssetBundles是一堆从你的Unity项目中导出的文件,这些文件以特殊的格式组织,并能够在你的项目中按需加载。AssetBundles通过后缀名支持所有Unity支持的文件类型。如果你想包含一些自定义的二进制数据,可以将使用.bytes作为后缀。Unity在导入时将把此类文件当作一个TextAsset。
开发阶段,开发者将AssetBundles上传至至服务器
这就有两个阶段:
3.1.1你需要通过编辑器构建AssetBundles。
3.1.2上传至服务器。
程序运行阶段,客户端从服务器下载AssetBundles,并按需操作每个AssetBundle中的资源。
即如下两个阶段:
3.2.1客户端运行时下载AssetBundles。
3.2.2从AssetBundles中加载对象。
4.1构建AssetBundles
4.1.1准备工作
我们事先准备一些简单的资源:简单的创建两个矩形,两个球形。
create_obj.png
选中一个Cube,在Inspector视口中的下方,有一个预览窗口。在预览窗口中,我们可以新建并指定资源将被打包进的AssetBundle(默认是None,这表示该资源不被打包进任何AssetBundle,而是被打包进主工程本身),如图:
new_assetbundle.png
图中有两个下拉框,左边的用于指定AssetBundle的名字,后边的用于指定AssetBundle Variants的名字(后文介绍)。
我们新建一个名为shape/cube的AssetBundle,将两个Cube资源指定到其中。新建一个名为shape/sphere的AssetBundle,将两个Sphere资源指定其中(对应的meta文件也将被指定到该AssetBundle)。AssetBundle的命名必须小写(即便写成大写也会被转换成小写),并且支持'/',这样可以在界面上开辟子目录。如图:
assetbundle_name.png
如果你创建了一些没有指定任何资源的AssetBundle,Remove Unused Names 按钮可以将其全部清除。
4.1.2导出AssetBundle
我们在项目中新建Editor文件夹,并在其中创建一个脚本:
BuildAssetBungle.cs
using UnityE
public class BuildAssetBundle
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
BuildPipeline.BuildAssetBundles("Assets/MyAssetBundles");
这样在菜单栏中,就会创建对应的按钮让我们执行构建操作。如图:
build_btn.png
在点击之前需要在Assets目录下创建AssetBundles文件夹。点击之后将弹出一个进度条对话框,完成后就生成了对应的AssetBundles:
assetbundles.png
可以看到这些AssetBundles是按照我们此前在编辑器中新建的AssetBundle的目录结构生成的。并且有这相关的以.manifest为后缀的文件。一个manifest文件是描述了对应资源文件的循环冗余码(CRC)和资源依赖(asset dependencies)的文本文件。
另外,你还会看到在MyAssetBundles文件夹下有一个MyAssetBundles文件和对应的manifest文件。每当构建AssetBundles时,就会创建这两个文件。
4.1.3其他工具
添加下面这个脚本Editor中,可以使你获取所有AssetBundles的名字:
GetAssetBundleNames.cs:
using UnityE
using UnityE
public class GetAssetBundleNames
[MenuItem("Assets/Get AssetBundle names")]
static void GetNames()
var names = AssetDatabase.GetAllAssetBundleNames();
foreach (var name in names)
Debug.Log("AssetBundle: " + name);
添加下面这个脚本Editor中,可以使你在改变AssetBundle时得到通知:
MyPostprocessor.cs:
using UnityE
using UnityE
public class MyPostprocessor : AssetPostprocessor
void OnPostprocessAssetbundleNameChanged(string path,
string previous, string next)
Debug.Log("AB: " + path + " old: " + previous + " new: " + next);
4.1.4AssetBundle Variants
AssetBundle Variants是Unity5的新特性。你可以将两组不同的资源指定为同一个AssetBundle但是指定不同的Variants,这样,你可以根据平台的不同加载不同的资源(例如支持高清资源的设备加载hd的Variants,不支持高清资源的设备加载sd的Variants)。可是使用设置Variants。
4.1.5编码建议
1.标记AssetBundle
使用.assetBundleName来设置AssetBundle的名字。
2.使用函数构建AssetBundle
函数原型:
public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions = BuildAssetBundleOptions.None, BuildTarget targetPlatform = BuildTarget.WebPlayer);
3.操纵Asset database中的AssetBundle names接口:
4.构建AssetBundle选项(BuildAssetBundleOptions)
选项总是启用的。
如果我们总是从assets开始而不是objects,该项将被忽略。它默认是完整的。
即便你没有改变资源,但是通过设置该项你可以强制从新构建资源。
即便你改变了type tree你也可以通过设置该项忽略掉。
与 是冲突的,如果你将type tree设置为不启用则无法忽略。
5.Manifest file
每个AssetBundle都有一个manifest文件,包含如下信息:
CRC(循环冗余码)资源文件的哈希码。在该AssetBundle中的所有资源有一个单一的哈希码,用于检查增量的构建。
Type tree哈希码。在该AssetBundle中所有类型有一个单一的哈希码,用于检查增量的构建。
Class types。该AssetBundle中所有的类类型。当为type tree做增量构建检查时将产生一个新的哈希码。
Asset names。该AssetBundle中所有明确包含的资源名字。依赖的AssetBundle的名字。依赖于该AssetBundle的其他AssetBundles。manifest文件仅用于检查增量构建,运行时不需要。因此不需要打包进正式发行的游戏中。
6.Single manifest file
一个单一的manifest文件一般包含以下信息:所有的AssetBundles。所有AssetBundles的依赖信息。
7.Single manifest AssetBundle
一个AssetBundleManifest对象有如下APIs:
返回本次构建的所有AssetBundles名字。
返回直接依赖的AssetBundle名字。
返回所有依赖的AssetBundle名字。
返回指定的AssetBundle的哈希码。
返回所有AssetBundles带Variant的名字。
8.AssetBundle 加载APIs
Unity5.x改为如下APIs:
返回该AssetBundle中的所有资源名。
如果该AssetBundle是一个场景文件,返回该场景中所有资源的路径。
从该AssetBundle中加载资源。
从该AssetBundle中加载所有资源。
通过名字加载该AssetBundle中的资源及子资源。还有对应的异步接口也有提供。组件类型不在返回了,你可以在加载了GameObject之后从其获取。
9.Typetrees
每个AssetBundle中都默认写入了一个typetree。只有Metro(Windows Store Apps)例外,它有不同的序列化方案。
参考链接:
专注游戏开发}

我要回帖

更多关于 增量资源 的文章

更多推荐

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

点击添加站长微信