unity WebGLunity 动态加载prefab资源加载不上去是什么情况

unity中从Resources下读取较大的资源会卡,有解决办法么? - 知乎83被浏览12416分享邀请回答11添加评论分享收藏感谢收起1添加评论分享收藏感谢收起查看更多回答Unity中资源动态加载的两种方式之AssetsBundle
我的图书馆
Unity中资源动态加载的两种方式之AssetsBundle
001.Load脚本,挂载到摄像机上&pre name="code" class="csharp"&using UnityE002.using System.C003.using UnityE004.&005.public class Build : MonoBehaviour006.{007.&&&&// 编辑器类008.&&&&[MenuItem("Build/BuildAsset")]009.&&&&// 打包单个资源的方法010.&&&&static void BuildAsset ()011.&&&&{012.&&&&&&&&// 将物体打包到/AssetsBundles路径下同时命名为Cube1.assetbundle013.&&&&&&&&string targetPath = Application.dataPath + "/AssetsBundles/Cube1.assetbundle"; 014.&&&&&&&&// BuildPipeline 打包用 Selection (Selection.activeObject 在编辑器中选中的对象)015.&&&&&&&&// 第二个参数null,是打包多个资源的时候用的,多个资源就是数组,单个资源的时候这个参数不用写016.&&&&&&&&// 第三个参数是路径,你想把这个资源放到什么位置就写什么,并且还要命名为.assetbundl格式017.&&&&&&&&BuildPipeline.BuildAssetBundle (Selection.activeObject, null, targetPath);018.&&&&&&&&// 刷新资源,直接可以在unity中看到刚才打包的东西019.&&&&&&&&AssetDatabase.Refresh();020.&&&&}021.&022.&&&&// --------------------------------------------------------------------------------023.&024.&025.&&&&[MenuItem("Build/BuildMultiAsset")]026.&&&&// 打包多个资源的时候使用这个方法027.&&&&static void BuildMultiAsset()028.&&&&{029.&&&&&&&&// 将物体打包到/AssetsBundles路径下同时命名为Cubes.assetbundle030.&&&&&&&&string target = Application.dataPath + "/AssetsBundles/Cubes.assetbundle";031.&&&&&&&&// 因为打包多个游戏对象,所以是一个数组,typr(Object)表示,只要选择的物体是Object类型就可以032.&&&&&&&&// 并且选择的模式是深度资源搜索(具体学名到底叫啥我也忘了。。。),033.&&&&&&&&// 意思是只要你选择的object对象下面如果还有关联的东西就都会一起打包(unity导出场景的时候应该可以感受到)034.&&&&&&&&Object[] cubes = Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);035.&&&&&&&&// 打包开始,因为是一堆资源,所以主资源为null,剩下两个参数意思同上036.&&&&&&&&BuildPipeline.BuildAssetBundle(null,cubes,target);037.&&&&&&&&// 刷新资源,直接可以在unity中看到刚才打包的东西038.&&&&&&&&AssetDatabase.Refresh();039.&&&&}040.&041.&&&&// --------------------------------------------------------------------------------042.&043.&&&&[MenuItem("Build/BuildScene")]044.&&&&// 打包场景的方法045.&&&&static void BuildScene()046.&&&&{047.&&&&&&&&// 场景名字,为什么是数组呢(因为参数里要求这个参数是数组类型。。。。)048.&&&&&&&&string [] sceneName =& new string[]{Application.dataPath + "/scene1.unity"};049.&&&&&&&&// 将物体打包到/AssetsBundles路径下同时命名为Scene1.assetbundle050.&&&&&&&&string targetPath = Application.dataPath + "/AssetsBundles/Scene1.assetbundle";051.&&&&&&&&// 注意打包的方法名已经变成流类型了,后面的最后一个参数表示你要在上面平台运行052.&&&&&&&&// iphone平台就是用BuildTarget.iPhone这个参数053.&&&&&&&&// 安卓平台就是用BuildTarget.&a href="" target="_blank" class="keylink"&Android&/a&这个参数054.&&&&&&&&// 类似参数可以自己查看。。。055.&&&&&&&&BuildPipeline.BuildStreamedSceneAssetBundle(sceneName,targetPath,BuildTarget.WebPlayer);056.&&&&&&&&// 刷新资源,直接可以在unity中看到刚才打包的东西057.&&&&&&&&AssetDatabase.Refresh();058.&&&&}059.&&&&// --------------------------------------------------------------------------------060.&&&&[MenuItem("Build/BuildDependence")]061.&&&&static void BuildDependence()062.&&&&{063.&&&&&&&&// 对一些公共参数的定义 //064.&&&&&&&&// 定义路径文件夹是Application.dataPath读取后的路径 加上 "/AssetBundles"065.&&&&&&&&string path = Application.dataPath + "/AssetsBundles";066.&&&&&&&&// 定义资源包的依赖关系选项067.&&&&&&&&BuildAssetBundleOptions buildOp = BuildAssetBundleOptions.CollectDependencies | pleteA068.&069.&&&&&&&&// ---------------------------------------------------------------------070.&071.&&&&&&&&// Push和Pop是成对出现的,他们的作用是维持一个依赖关系072.&&&&&&&&// 我们当前的资源包关系是这样的:073.&&&&&&&&/*074.&&&&&&&&&&&&Tex1.assetbundle资源包(Tex1的包里有以下2个资源包)075.&&&&&&&&&&&&&&&&c1.assetbundle资源包(c1和c2是平级关系)076.&&&&&&&&&&&&&&&&c2.assetbundle资源包&& 077.&&&&&&&&*/078.&&&&&&&&//依赖资源压栈079.&&&&&&&&BuildPipeline.PushAssetDependencies();080.&081.&&&&&&&&// 替代之前的selection的手动选择方式082.&&&&&&&&Object tex = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Tex1.jpg");083.&084.&&&&&&&&// 所有后续资源将共享这一资源包中的内容,但是你要保证的是,在使用c1和c2这种内层依赖包时085.&&&&&&&&// 你已经加载了最外层资源包Tex1086.&&&&&&&&BuildPipeline.BuildAssetBundle(tex, null,path + "/Tex1.assetbundle", buildOp);087.&088.&&&&&&&&// 这里使用一对Push和Pop是将我们接下来加载的c1资源包和tex依赖起来089.&&&&&&&&BuildPipeline.PushAssetDependencies();090.&&&&&&&&Object c1 = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Cube1.prefab");091.&&&&&&&&BuildPipeline.BuildAssetBundle(c1, null, path + "/c1.assetbundle", buildOp);092.&&&&&&&&BuildPipeline.PopAssetDependencies();093.&094.&&&&&&&&// 同上095.&&&&&&&&BuildPipeline.PushAssetDependencies();096.&&&&&&&&Object c2 = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Cube2.prefab");097.&&&&&&&&BuildPipeline.BuildAssetBundle(c2, null,path + "/c2.assetbundle", buildOp);098.&&&&&&&&BuildPipeline.PopAssetDependencies();099.&100.&&&&&&&&// 依赖资源出栈101.&&&&&&&&BuildPipeline.PopAssetDependencies();102.&&&&&&&&AssetDatabase.Refresh();103.&&&&}104.&105.&106.}
馆藏&21216
TA的推荐TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢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 web 项目加载慢和卡呢? - 知乎6被浏览835分享邀请回答01 条评论分享收藏感谢收起最近老板要我做一个培训游戏,由于我们公司主要是做网站的,自然是要做网页版的游戏了。
如果让我用网页端的技术来开发游戏,实在是有心无力,于是我提议用我最熟悉的技术来做,毫无疑问,只能选择Unity3D了。
在Unity3D的新版本中(我使用的是5.4.2),已经不支持生成WebPlayer了,只能生成WebGL版本。
(小姑娘:废话还真多)
1.问题描述
为了减小服务器的压力,我打算把游戏所需的静态数据(即不会发生改变的死数据)保存到CSV文件里,关于这个,大家有兴趣的话,我下次再聊聊(直接在公众号里发消息给我吧,我会看到的)。
在WebGL中读取文件只能用WWW了,可是折腾了好久,就是读不到任何数据。
2.解决方法
突然灵机一戳(小姑娘:是灵机一动!),我想到了,没错,CSV文件必须是Utf-8格式,否则是加载不出来的。
有可能是文件里包含了中文导致的(没有去验证)。
3.保存Utf-8格式的方法
先用记事本打开CSV文件,然后另存为,下方有一个文件格式的下拉选项,选择Utf-8,保存即可:
4.唠叨一下
Unity3D发布WebGL真是太慢了!
------点一点广告,支持笨木头------

我要回帖

更多关于 unity 动态加载prefab 的文章

 

随机推荐