unity中从Resources下unity3d 读取配置文件较大的资源会卡,有解决办法么

将某二进制文件放在Resources目录下,希望用Resources.Load&TextAsset&的方式读取,发现TextAsset是null
查阅Unity文档得知,使用Resources.Load读二进制文件,则文件扩展名必须为bytes
另外注意,Resources.Load的路径不要包含扩展名
Please notice that files with the&.txt&and&.bytes&extension will be treated as text and binary files, respectively. Do not attempt to store a binary file using the&.txt extension, as this will create unexpected behaviour when attempting to read data from it.
/Manual/class-TextAsset.html
阅读(...) 评论()吐槽一下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的更新。&不知道论坛里的各路高人有没有更合适的解决办法?
要评论请先&或者&
其实答案已经在你手中,既然不能all,也不能every打包,那么采取的做法就是相关联的几个every打包,具体是多少个看具体情况。
建议更新程序绕开unity,单独做。&unity局限还是很大的,目前只适合搞点小项目,规模大了要自己补充很多专用工具才行的。
同样吐槽,普通的c#读文件,复杂些用用AssetsBundle,好像只AssetsBundle有的脚本,不能加载进去,不知道有没有人遇到。
:同样吐槽,普通的c#读文件,复杂些用用AssetsBundle,好像只AssetsBundle有的脚本,不能加载进去,不知道有没有人遇到。 ( 12:05) C#读不了Unity的资源啊 读读文本或者自定义格式而已AssetBundle只能静态打包 无法更新 增量其中内容
将一个项目分为两个编辑环境,一个是editor,一个是target。editor只是策划人员拖拖拽拽编辑场景,打包时程序自动将每个场景资源打包生成一个XXX.unity3d文件,并最后生成一个场景配置文件(xml或json),最终这些文件都会放到server端(或某个local目录)。target环境只有程序代码,由程序员负责,没有场景资源。运行时入口程序通过读取场景配置文件,动态导入server端的XXX.unity3d,并且初始化场景。调试程序修改bug,最后生成手机或网页可运行的最终程序。以后只需要策划更新某个XXX.unity3d文件覆盖原来的即可,不需要程序员参与。
:将一个项目分为两个编辑环境,一个是editor,一个是target。editor只是策划人员拖拖拽拽编辑场景,打包时程序自动将每个场景资源打包生成一个XXX.unity3d文件,并最后生成一个场景配置文件(xml或j .. ( 15:33) 更新是一码事 AutoPatch又是另一码事现在困惑的就是这个AssetBundle不能更新和增量 要就整个替换 要就不新这种机制 要是做成魔兽的规模 更新个boss模型 用户就要重下整个MPQ,那还不吐血了?所以说这种模式作分场景stream player是很好 但压根就没考虑autopatch的难处
:更新是一码事 AutoPatch又是另一码事现在困惑的就是这个AssetBundle不能更新和增量 要就整个替换 要就不新这种机制 要是做成魔兽的规模 更新个boss模型 用户就要重下整个MPQ,那还不吐血了? ( 15:37) 我说的不是整个场景打包,而是对每个单体打包,生成n个xxx.unity3d文件。
:我说的不是整个场景打包,而是对每个单体打包,生成n个xxx.unity3d文件。 ( 15:41) 我上面也写了 目前能想到的也只有这种办法了但assetBundle其实是包的结构 这样打很浪费资源,分成单体也很浪费存储资源。而且打的时候是无法获取目录信息的 还得自己用c#加上unity的editor脚本,c#文件IO获得路径,编辑器脚本获得名字并打包,一个个打并写到相应目录里去。打包过程也是非常之慢,打1图片文件和打10个图片文件速度差不多。
直接换引擎啊。unity本来就是个半残的东西,不适合做大项目。2060人阅读
Unity3D(150)
大家可能都知道在Unity3D中如何实现动态加载资源的方法,就是把资源放在Resources目录下,使用Resources.Load方法即可动态加载资源。但将资源放在Resources目录下有一个问题,那就是打包程序的时候会将Resources目录下的全部文件都加密压缩打进包内,这样如果我们想使用assetbundle方式打小包的话就不行了。之前一直在考虑这个问题,最近在翻看API文档的时候发现有个方法叫Resources.LoadAssetAtPath,这个方法可以让你加载Assets目录下任何一个位置的资源,但只是在编辑器模式下。利用这个方法,我们可以在测试和发布时使用两种不同的策略来加载资源:在编辑器测试环境使用Resources.LoadAssetAtPath方法动态加载资源;在发布环境中使用assetbundle方式加载动态资源。
Unity3D--定义摄像机的投影矩阵
Unity3D 几个默认函数的区分
Unity3D 一个设置方向键移动和空格起跳的脚本
Unity3D 给对象(gameObject)添加脚本代码
下面贴出代码片段:
  // 通过Resources.LoadAtPath方法动态加载Prefab
& & private void LoadPrefabByResources()
& & & & Object prefab = Resources.LoadAssetAtPath(&Assets/Prefabs/Cube.prefab&, typeof(GameObject));
& & & & GameObject cube = (GameObject)Instantiate(prefab);
& & & & cube.transform.parent =
同时我做了一个简单的Example,下载地址:
免费下载地址在
用户名与密码都是
具体下载目录在 /2014年资料/6月/17日/Unity3D中实现动态加载Resources目录外的资源
下载方法见
PS: 项目目录中的Tools文件夹内包含一个HFS.exe是在本地模拟http文件服务的小工具。利用它你可以将本地文件映射为http可以访问的文件。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:419121次
积分:5433
积分:5433
排名:第4914名
原创: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)Unity3D中实现动态加载Resources目录外的资源_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Unity3D中实现动态加载Resources目录外的资源
来源:Linux社区&
作者:cosmos53076
大家可能都知道在Unity3D中如何实现动态加载资源的方法,就是把资源放在Resources目录下,使用Resources.Load方法即可动态加载资源。但将资源放在Resources目录下有一个问题,那就是打包程序的时候会将Resources目录下的全部文件都加密压缩打进包内,这样如果我们想使用assetbundle方式打小包的话就不行了。之前一直在考虑这个问题,最近在翻看API文档的时候发现有个方法叫Resources.LoadAssetAtPath,这个方法可以让你加载Assets目录下任何一个位置的资源,但只是在编辑器模式下。利用这个方法,我们可以在测试和发布时使用两种不同的策略来加载资源:在编辑器测试环境使用Resources.LoadAssetAtPath方法动态加载资源;在发布环境中使用assetbundle方式加载动态资源。
Unity3D--定义摄像机的投影矩阵
Unity3D 几个默认函数的区分
Unity3D 一个设置方向键移动和空格起跳的脚本
Unity3D 给对象(gameObject)添加脚本代码
下面贴出代码片段:
  // 通过Resources.LoadAtPath方法动态加载Prefab& & private void LoadPrefabByResources()& & {& & & & Object prefab = Resources.LoadAssetAtPath("Assets/Prefabs/Cube.prefab", typeof(GameObject));& & & & GameObject cube = (GameObject)Instantiate(prefab);& & & & cube.transform.parent =& & }
同时我做了一个简单的Example,下载地址:
免费下载地址在
用户名与密码都是
具体下载目录在 /2014年资料/6月/17日/Unity3D中实现动态加载Resources目录外的资源
下载方法见
PS: 项目目录中的Tools文件夹内包含一个HFS.exe是在本地模拟http文件服务的小工具。利用它你可以将本地文件映射为http可以访问的文件。
Unity3D 的详细介绍:Unity3D 的下载地址:
本文永久更新链接地址:
相关资讯 & & &
& (12/09/:24)
& (07/17/:47)
& (01月03日)
& (08/28/:08)
& (04/04/:55)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款}

我要回帖

更多关于 unity 读取资源 的文章

更多推荐

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

点击添加站长微信