Unity3d Web3d资源的动态加载
2013-10-27 00:10
357 查看
Unity3d Web3d资源的动态加载
@灰太龙
参考了宣雨松的博客,原文出处http://www.xuanyusong.com/archives/2405,如果涉及到侵权,请通知我!
Unity3d Web3d资源的动态加载中,用到了AssetBundle,在这儿我讲解一下,AssetBundle是个什么东西,AssetBundle可以将GameObject和这个GameObject所需要的资源一起打包进来,也就是说在Web端需要实例化这个资源的时候,就去下载这个所需要的资源,并且实例化这个东西!
下面列出打包的代码:
下面是要所有GameObject做成Prefab,然后对Prefab进行打包,打包成assetbundle文件,然后加载了这个assetbundle资源之后,就可以用Instantiate的方式,建立这个物体!
选择Custom Editor/Foreach AssetBunldes ALL打包,可以打包所选择的所有预制件,并且生成了一个gameobjects.txt文件,打包的时候assetbundle的文件名和预制件的名字一样,
那么我们初始化物体的时候,需要读取这个gameobjects.txt文件,依次初始化物体, 这样就实现了物体的分块加载!
加载代码如下:
通过for循环依次加载物体!还有个问题就是打包的assetbundle中初始化出来的Prefab,有些脚本指向的GameObject或者Transform丢失,这个时候,可以有GameObject.FindWithTag的功能或者GameObject.Find来查找物体,也就是说专门有一个脚本去为另一个脚本赋值,这个脚本如果完成了赋值操作,就Destory(this)来销毁自己!举个例子!这个Set脚本,就是为加在同一个GameObject的物体的igui的一个脚本中变量赋值的,当赋值工作完成后,就Destory(this)来销毁脚本!
1.我看到别人把每个物体导出为.unity3d,然后也导出了变换信息,我认为这是不需要的,因为预制件中已经包含了这些信息!
2.还有就是有的问题需要注意,比如角色站在地板上,那么如果角色在地板之前加载,那么角色会掉下去,这个时候,要先加载地板,或者后加载地板,设置人物不受重力影响!等地板加载完之后,再设置人物受重力影响,防止掉落下去!
@灰太龙
参考了宣雨松的博客,原文出处http://www.xuanyusong.com/archives/2405,如果涉及到侵权,请通知我!
Unity3d Web3d资源的动态加载中,用到了AssetBundle,在这儿我讲解一下,AssetBundle是个什么东西,AssetBundle可以将GameObject和这个GameObject所需要的资源一起打包进来,也就是说在Web端需要实例化这个资源的时候,就去下载这个所需要的资源,并且实例化这个东西!
下面列出打包的代码:
1 using UnityEngine; using System.Collections; using System.IO; using UnityEditor; public class ExportAssetBundle : EditorWindow { [MenuItem("Custom Editor/Create AssetBunldes Main")] static void CreateAssetBunldesMain () { //获取在Project视图中选择的所有游戏对象 Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets); //遍历所有的游戏对象 foreach (Object obj in SelectedAsset) { string sourcePath = AssetDatabase.GetAssetPath (obj); //本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径 //StreamingAssets是只读路径,不能写入 //服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。 string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle"; if (BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)) { Debug.Log(obj.name +"资源打包成功"); } else { Debug.Log(obj.name +"资源打包失败"); } } //刷新编辑器 AssetDatabase.Refresh (); } [MenuItem("Custom Editor/Create AssetBunldes ALL")] static void CreateAssetBunldesALL () { Caching.CleanCache (); string Path = Application.dataPath + "/StreamingAssets/ALL.assetbundle"; Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets); foreach (Object obj in SelectedAsset) { Debug.Log ("Create AssetBunldes name :" + obj); } //这里注意第二个参数就行 if (BuildPipeline.BuildAssetBundle (null, SelectedAsset, Path, BuildAssetBundleOptions.CollectDependencies)) { AssetDatabase.Refresh (); } else { } } [MenuItem("Custom Editor/Foreach AssetBunldes ALL")] static void ExportAllAssetBunldesAll() { StreamWriter write=new StreamWriter(Application.dataPath + "/StreamingAssets/gameobjects.txt"); Caching.CleanCache(); Object[] SeletedAsset=Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets); foreach(Object obj in SeletedAsset) { write.Write(obj.name+" "); Debug.Log(obj.name.ToString()); string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle"; if (BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)) { Debug.Log(obj.name +"资源打包成功"); } else { Debug.Log(obj.name +"资源打包失败"); } } write.Flush(); write.Close(); } }
下面是要所有GameObject做成Prefab,然后对Prefab进行打包,打包成assetbundle文件,然后加载了这个assetbundle资源之后,就可以用Instantiate的方式,建立这个物体!
选择Custom Editor/Foreach AssetBunldes ALL打包,可以打包所选择的所有预制件,并且生成了一个gameobjects.txt文件,打包的时候assetbundle的文件名和预制件的名字一样,
那么我们初始化物体的时候,需要读取这个gameobjects.txt文件,依次初始化物体, 这样就实现了物体的分块加载!
加载代码如下:
1 using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Net; public class Load : MonoBehaviour { // Use this for initialization void Start () { StartCoroutine(START()); } private IEnumerator START() { string temp=""; string url="http://--------------------------------------------/gameobjects.txt"; WWW www=new WWW(url); yield return www; temp=www.text; string asseturl="http://-----------------------------------"; string[] temp1=temp.Split(' '); for(int i=0;i<temp1.Length;i++) { Debug.Log(temp1[i].ToString()+"-------------"); StartCoroutine(LoadMainCacheGameObject(asseturl+temp1[i]+".asset")); } } private IEnumerator LoadMainCacheGameObject(string path) { WWW bundle = WWW.LoadFromCacheOrDownload(path,1); yield return bundle; //加载到游戏中 yield return Instantiate(bundle.assetBundle.mainAsset); bundle.assetBundle.Unload(false); } }
通过for循环依次加载物体!还有个问题就是打包的assetbundle中初始化出来的Prefab,有些脚本指向的GameObject或者Transform丢失,这个时候,可以有GameObject.FindWithTag的功能或者GameObject.Find来查找物体,也就是说专门有一个脚本去为另一个脚本赋值,这个脚本如果完成了赋值操作,就Destory(this)来销毁自己!举个例子!这个Set脚本,就是为加在同一个GameObject的物体的igui的一个脚本中变量赋值的,当赋值工作完成后,就Destory(this)来销毁脚本!
using UnityEngine; using System.Collections; public class Set : MonoBehaviour { iGUICode_demo demo; bool flag1=false; bool flag2=false; bool flag3=false; bool flag4=false; void Start() { demo=GetComponent<iGUICode_demo>(); } // Update is called once per frame void Update () { if(!flag1) { GameObject temp1=GameObject.FindWithTag("AutoWander"); if(temp1!=null) { demo._autoPerson=temp1; flag1=true; } } if(!flag2) { GameObject temp2=GameObject.FindWithTag("ManualWander"); if(temp2!=null) { demo._manualPerson=temp2; ObjManager._camera=temp2; flag2=true; } } if(!flag3) { GameObject temp3= GameObject.Find("iGUIListBoxSimple(Clone)"); if(temp3!=null) { ObjManager._window=temp3; flag3=true; } } if(flag1&&flag2&&flag3) { demo._autoPerson.SetActive(false); Destroy(this); } } }
1.我看到别人把每个物体导出为.unity3d,然后也导出了变换信息,我认为这是不需要的,因为预制件中已经包含了这些信息!
2.还有就是有的问题需要注意,比如角色站在地板上,那么如果角色在地板之前加载,那么角色会掉下去,这个时候,要先加载地板,或者后加载地板,设置人物不受重力影响!等地板加载完之后,再设置人物受重力影响,防止掉落下去!
相关文章推荐
- 在Unity3D的网络游戏中实现资源动态加载
- Unity3D-动态加载资源
- [Unity3D]网游中实现资源动态加载 。。手游消减内存必备。。。
- Unity3D的网络游戏中实现资源动态加载
- Unity3D实现动态加载游戏资源
- 在Unity3D的网络游戏中实现资源动态加载
- Unity3D AssetBundles 动态加载游戏资源
- Unity3D实现动态加载游戏资源(转)
- Unity3D实现动态加载游戏资源
- ]Unity3D实现动态加载游戏资源(转)
- Unity3D中实现动态加载Resources目录外的资源
- 在Unity3D的网络游戏中实现资源动态加载
- unity3d动态加载资源
- 在Unity3D的网络游戏中实现资源动态加载
- 在Unity3D的网络游戏中实现资源动态加载
- Unity3D的网络游戏中实现资源动态加载
- 在Unity3D的网络游戏中实现资源动态加载
- 【转】在Unity3D的网络游戏中实现资源动态加载
- 在Unity3D的网络游戏中实现资源动态加载
- Unity3D AssetBundles 动态加载游戏资源