Unity3d Web3d资源的动态加载

@灰太龙

参考了宣雨松的博客,原文出处http://www.xuanyusong.com/archives/2405,如果涉及到侵权,请通知我!

Unity3d Web3d资源的动态加载中,用到了AssetBundle,在这儿我讲解一下,AssetBundle是个什么东西,AssetBundle可以将GameObject和这个GameObject所需要的资源一起打包进来,也就是说在Web端需要实例化这个资源的时候,就去下载这个所需要的资源,并且实例化这个东西!

下面列出打包的代码:

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.IO;
  4. using UnityEditor;
  5. public class ExportAssetBundle : EditorWindow {
  6.  
  7. [MenuItem("Custom Editor/Create AssetBunldes Main")]
  8. static void CreateAssetBunldesMain ()
  9. {
  10. //获取在Project视图中选择的所有游戏对象
  11. Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);
  12. //遍历所有的游戏对象
  13. foreach (Object obj in SelectedAsset)
  14. {
  15. string sourcePath = AssetDatabase.GetAssetPath (obj);
  16. //本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径
  17. //StreamingAssets是只读路径,不能写入
  18. //服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。
  19. string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle";
  20. if (BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)) {
  21. Debug.Log(obj.name +"资源打包成功");
  22. }
  23. else
  24. {
  25. Debug.Log(obj.name +"资源打包失败");
  26. }
  27. }
  28. //刷新编辑器
  29. AssetDatabase.Refresh ();
  30. }
  31. [MenuItem("Custom Editor/Create AssetBunldes ALL")]
  32. static void CreateAssetBunldesALL ()
  33. {
  34.  
  35. Caching.CleanCache ();
  36. string Path = Application.dataPath + "/StreamingAssets/ALL.assetbundle";
  37.  
  38. Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);
  39.  
  40. foreach (Object obj in SelectedAsset)
  41. {
  42. Debug.Log ("Create AssetBunldes name :" + obj);
  43. }
  44.  
  45. //这里注意第二个参数就行
  46. if (BuildPipeline.BuildAssetBundle (null, SelectedAsset, Path, BuildAssetBundleOptions.CollectDependencies)) {
  47. AssetDatabase.Refresh ();
  48. } else {
  49.  
  50. }
  51. }
  52. [MenuItem("Custom Editor/Foreach AssetBunldes ALL")]
  53. static void ExportAllAssetBunldesAll()
  54. {
  55. StreamWriter write=new StreamWriter(Application.dataPath + "/StreamingAssets/gameobjects.txt");
  56. Caching.CleanCache();
  57. Object[] SeletedAsset=Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);
  58. foreach(Object obj in SeletedAsset)
  59. {
  60. write.Write(obj.name+" ");
  61. Debug.Log(obj.name.ToString());
  62. string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle";
  63. if (BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies))
  64. {
  65. Debug.Log(obj.name +"资源打包成功");
  66. }
  67. else
  68. {
  69. Debug.Log(obj.name +"资源打包失败");
  70. }
  71. }
  72. write.Flush();
  73. write.Close();
  74. }
  75. }

下面是要所有GameObject做成Prefab,然后对Prefab进行打包,打包成assetbundle文件,然后加载了这个assetbundle资源之后,就可以用Instantiate的方式,建立这个物体!

选择Custom Editor/Foreach AssetBunldes ALL打包,可以打包所选择的所有预制件,并且生成了一个gameobjects.txt文件,打包的时候assetbundle的文件名和预制件的名字一样,

那么我们初始化物体的时候,需要读取这个gameobjects.txt文件,依次初始化物体, 这样就实现了物体的分块加载!

加载代码如下:

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Net;
  5. public class Load : MonoBehaviour {
  6.  
  7. // Use this for initialization
  8. void Start () {
  9. StartCoroutine(START());
  10. }
  11. private IEnumerator START()
  12. {
  13. string temp="";
  14. string url="http://--------------------------------------------/gameobjects.txt";
  15. WWW www=new WWW(url);
  16. yield return www;
  17. temp=www.text;
  18. string asseturl="http://-----------------------------------";
  19. string[] temp1=temp.Split(' ');
  20. for(int i=;i<temp1.Length;i++)
  21. {
  22. Debug.Log(temp1[i].ToString()+"-------------");
  23. StartCoroutine(LoadMainCacheGameObject(asseturl+temp1[i]+".asset"));
  24. }
  25. }
  26. private IEnumerator LoadMainCacheGameObject(string path)
  27. {
  28. WWW bundle = WWW.LoadFromCacheOrDownload(path,);
  29. yield return bundle;
  30. //加载到游戏中
  31. yield return Instantiate(bundle.assetBundle.mainAsset);
  32. bundle.assetBundle.Unload(false);
  33. }
  34. }

通过for循环依次加载物体!还有个问题就是打包的assetbundle中初始化出来的Prefab,有些脚本指向的GameObject或者Transform丢失,这个时候,可以有GameObject.FindWithTag的功能或者GameObject.Find来查找物体,也就是说专门有一个脚本去为另一个脚本赋值,这个脚本如果完成了赋值操作,就Destory(this)来销毁自己!举个例子!这个Set脚本,就是为加在同一个GameObject的物体的igui的一个脚本中变量赋值的,当赋值工作完成后,就Destory(this)来销毁脚本!

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class Set : MonoBehaviour {
  5.  
  6. iGUICode_demo demo;
  7. bool flag1=false;
  8. bool flag2=false;
  9. bool flag3=false;
  10. bool flag4=false;
  11. void Start()
  12. {
  13. demo=GetComponent<iGUICode_demo>();
  14. }
  15. // Update is called once per frame
  16. void Update () {
  17. if(!flag1)
  18. {
  19. GameObject temp1=GameObject.FindWithTag("AutoWander");
  20. if(temp1!=null)
  21. {
  22. demo._autoPerson=temp1;
  23. flag1=true;
  24. }
  25. }
  26. if(!flag2)
  27. {
  28. GameObject temp2=GameObject.FindWithTag("ManualWander");
  29. if(temp2!=null)
  30. {
  31. demo._manualPerson=temp2;
  32. ObjManager._camera=temp2;
  33. flag2=true;
  34. }
  35. }
  36. if(!flag3)
  37. {
  38. GameObject temp3= GameObject.Find("iGUIListBoxSimple(Clone)");
  39. if(temp3!=null)
  40. {
  41. ObjManager._window=temp3;
  42. flag3=true;
  43. }
  44. }
  45. if(flag1&&flag2&&flag3)
  46. {
  47. demo._autoPerson.SetActive(false);
  48. Destroy(this);
  49. }
  50. }
  51. }

1.我看到别人把每个物体导出为.unity3d,然后也导出了变换信息,我认为这是不需要的,因为预制件中已经包含了这些信息!

2.还有就是有的问题需要注意,比如角色站在地板上,那么如果角色在地板之前加载,那么角色会掉下去,这个时候,要先加载地板,或者后加载地板,设置人物不受重力影响!等地板加载完之后,再设置人物受重力影响,防止掉落下去!

Unity3d Web3d资源的动态加载的更多相关文章

  1. 【Unity3D】Unity3D之 Resources.Load 动态加载资源

    [Unity3D]Unity3D之 Resources.Load 动态加载资源 1.Resources.Load:使用这种方式加载资源,首先需要下Asset目录下创建一个名为Resources的文件夹 ...

  2. [UE4]一个好用的虚幻4插件,根据资源名称动态加载资源,GetCurrentLeveName(获得当前地图名称)

    下载地址 一.下载与UE4相对应的版本 二.在工程根目录新建Plugins目录,解压插件. 三.如果工程已经打开,则需要重新打开   四.重新打开工程后,右下角会有提示有新插件可用. 五.这个插件提供 ...

  3. 【NGUI】Unity3D UIGrid 排序、动态加载与销毁

    本帖最后由 Lucifer_H 于 2014-10-31 09:39 编辑 做 UIGrid 的动态加载是做游戏的装备列表时用到的,装备信息都是从后台发过来的,具体加载的代码如下: [C#] 纯文本查 ...

  4. unity3d 加密资源并缓存加载

    原地址:http://www.cnblogs.com/88999660/archive/2013/04/10/3011912.html 首先要鄙视下unity3d的文档编写人员极度不负责任,到发帖为止 ...

  5. (转)unity3d加密资源并缓存加载

    http://www.haogongju.net/art/1931680 首先要鄙视下unity3d的文档编写人员极度不负责任,到发帖为止依然没有更新正确的示例代码. view source   pr ...

  6. 在Unity3D的网络游戏中实现资源动态加载

    用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕.应该优先加载用户附近的场景资源,在游 ...

  7. (转)在Unity3D的网络游戏中实现资源动态加载

    原文:http://zijan.iteye.com/blog/911102 用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的 ...

  8. unity3d动态加载资源

    在Unity3D的网络游戏中实现资源动态加载 分类: 最新学习2012-06-14 13:35 1127人阅读 评论(0) 收藏 举报 网络游戏nullvectorjson游戏string 用Unit ...

  9. Unity3D动态加载外部资源

    最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质上我理解没有什么区别.Resources ...

随机推荐

  1. [RxJS] Transformation operators: debounce and debounceTime

    Debounce and debounceTime operators are similar to delayWhen and delay, with the difference that the ...

  2. 利用 Lua 实现 App 动态化方案

    因为动态化的东西我第一次看实现方案的源码,而且目前还是大三的学生,缺少很多实践经验说错的地方还请原谅,也希望能指出,被告知.想了很久还是决定写出来,求大神勿喷. 并且我的一个朋友bestswifter ...

  3. clearTimeout(timeoutfunc) 是否有必要执行

    当使用 setTimeout() 方法的时候,是否必须执行 clearTimeout() ? 在 setTimeout() 内的函数执行之前,如果想要阻止执行该方法,是有必要执行 cleartTime ...

  4. 关于text-align无法居中的问题

    昨天项目,一直出现一个无法居中的问题,最后发现竟然是text-align的问题,才发现自己对text-align的理解还是不够透彻,于是在此再举例分析下. css中的元素一共有三类:块元素.行内块和内 ...

  5. codevs 3052 多米诺 二分图匹配

    /*codevs 3052 二分图匹配 把矩阵分两批 黑和白 且黑白不相交 这就构成了二分图的两部分 然后求最大匹配*/ #include<cstdio> #include<cstr ...

  6. 实用脚本 - - addLoadEvent 页面加载完毕执行函数

    function addLoadEvent(func){ var oldonload = window.onload; if(typeof window.onload != "functio ...

  7. jni使用

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 简介 详解 JNI 元素 JNI函数实战 AndroidmkApplicationmk Androidmk Applicat ...

  8. "库未注册"(Library not registered)异常.

    启发链接:http://social.msdn.microsoft.com/Forums/vstudio/en-US/f25b80bc-ecd4-4c37-8be3-9106a765b072/libr ...

  9. c++ Cout 输出格式

    控制符是在头文件iomanip.h中定义的对象.使用前必须把iomanip.h包含进来 1. I/O的书写格式 I/0流是输入或输出的一系列字节,当程序需要在屏幕上显示输出时,可以使用插入操作符“&l ...

  10. 用java写bp神经网络(三)

    孔子曰,吾日三省吾身.我们如果跟程序打交道,除了一日三省吾身外,还要三日一省吾代码.看代码是否可以更简洁,更易懂,更容易扩展,更通用,算法是否可以再优化,结构是否可以再往上抽象.代码在不断的重构过程中 ...