U3D的资源管理机制

最近作一个跨平台项目,需要实现代码和资源分离,这样主程序包除了主界面和一些字体、UI资源以外,没有多余的东西,游戏资源在首次进入游戏时通过下载获得,并且日后可以自动更新(AtuoPatch),当然这种更新不包含可执行代码。
 
然后就碰到问题了,目前在U3D中大致想到几种手段实现:
 
1.Resources.Load方式,其实这种方法根本不能用于Autopatch机制。Resources.Load只能访问程序打包时生成的Resources资源包,也就是Resources目录底下的所有东西,不能访问以外的内容,这个Resources资源包是打包时生成的静态文件,不支持运行时的的增删和更新。
 
2.自己把资源文件打包zip,玩家更新时通过WWW下载后解压到Application.persistentDataPath,解压机制本身可以实现覆盖更新和增量。已经实现跨平台的解压、读写数据文件。但是这种单纯的文件,只能通过.net文件操作或者WWW加载,而WWW只能加载文本、2进制数据或者.jpg和.png图片,并且图片读入是raw 32/24bit格式,不带压缩,这在手机平台是完全不能接受的(载入Texture2D以后可以通过compress方法进行运行时动态压缩,但是速度很慢而且只支持DXT方式,也不能考虑)。Unity的各种其他资源如模型、材质、场景等也无法通过这种方式加载(事实上本来也无法导出这些文件,格式都是封闭的),所以限制很大。
 
3.Unity自己的AssetsBundle方式:这种方法看起来好像很好。可以把Unity的所有资源以设定的选项打包,贴图包含了设定好的目标平台压缩选项,也可以加载所有Unity的资源类型。个人理解,这个AssetsBundle其实就是Resources.Load的扩展,只是文件来源不局限于打包时生成的Resources文件,可以扩展到整个可用存储体和网络。 但是仔细研究这个AssetBundle以后发现,这个体系的设计思路是给Stream Player用的,运行时动态加载新场景内容,这种方式用起来很方便,但是并不适合一般的资源文件AutoPatch概念。AssetBundle并不支持运行时文件级的增量、更新操作,资源打进去就是静态的了。举个例子我的程序下载了一个1.AssetBundle文件,包含所有游戏内容需要的资源,但如果我想更新里面其中一张背景图,我只能自己手工重新建一个新的AssetBundle,更新这张图片然后让玩家重新下载整个资源文件。再举个增量的例子,比如我的游戏在1.2版本时包含20个场景地图,5个职业种族,我发布了一个1.AssetBundle包含这些资源;日后我更新到1.5版,增加了10个地图,1个职业,我增加一个2.AssetBundle包含这些新增资源,但是在AssetBundle的体系下,我的代码就很蛋疼了。场景1-20、角色1-5在资源包1里,场景21-30、角色6在资源包2里,这种代码完全无法预先写死,而且如果继续更新,我的资源加载代码会越来越蛋疼,所以可以考虑的还就只能是资源始终在一个包里,要更新就得全部更新。
 
目前能想到唯一通用又可能的办法就是:把每个资源单独打包成一个AssetBundle文件,然后程序在启动通过www读取一个autopatch列表,更新、增加这些单体AssetBundle文件,来实现一个将就的文件级的autopatch机制,又能支持所有Unity资源加载并包含相应平台的压缩格式。程序通过配置文件找到对应的AssetBundle文件名并加载之,实现动态内容更新。不过如果有几百上千个文件,这个单体打包的过程就是个噩梦....,而且AssetBundle本身是个包的概念,并不太适用于单体文件,用起来很浪费。所以这也就是个理论上可行的方式而已。
 
其实需求很明确:要么提供一个单体资源导出/加载机制,程序自己去管理和组织资源包。不然就提供一个运行时能对已打包资源包 进行单个资源为单位的增加/更新操作的接口,并提供一个统一的加载接口。这种需求我想不是我一个人有吧....。目前的体系下,只能从unity打包的资源包里加载资源,资源包又不能动态更新的机制实在是很难满足一般网游Autopatch的需求,这种机制只能实现All or Nothing的更新。
 
不知道论坛里的各路高人有没有更合适的解决办法?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值