打包Assetbundle并加载

转自:http://blog.csdn.net/dingxiaowei2013/article/details/17439887

由于我们要将模型资源放在远程的服务器端,但如果直接放fbx模型是不可以加载的,所以我们可以将fbx做成预设或者是直接将其打包成assetbundle格式的,然后通过www来加载获取。

1.首先要讲一下不同平台下的一个StreamingAssets路径,这是不同的。

  1.         //不同平台下StreamingAssets的路径是不同的,这里需要注意一下。  
  2.         public static readonly string PathURL =  
  3. #if UNITY_ANDROID   //安卓  
  4.         "jar:file://" + Application.dataPath + "!/assets/";  
  5. #elif UNITY_IPHONE  //iPhone  
  6.         Application.dataPath + "/Raw/";  
  7. #elif UNITY_STANDALONE_WIN || UNITY_EDITOR  //windows平台和web平台  
  8.     "file://" + Application.dataPath + "/StreamingAssets/";  
  9. #else  
  10.         string.Empty;  
  11. #endif  

这就获取到了不同平台的一个路径,我们可以将打包的文件放在这些路径下,然后再从这路径去读取资源。

2.关于打包assetbundle的脚本

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

前提要新手动创建一个StreamingAssets文件夹

3.读取资源,这里只举例从本地读取,跟从网络读取是一样的,可以参考官方文档:

http://game.ceeger.com/Script/WWW/WWW.html

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class RunScript : MonoBehaviour  
  5. {  
  6.       
  7.   
  8.         //不同平台下StreamingAssets的路径是不同的,这里需要注意一下。  
  9.         public static readonly string PathURL =  
  10. #if UNITY_ANDROID  
  11.         "jar:file://" + Application.dataPath + "!/assets/";  
  12. #elif UNITY_IPHONE  
  13.         Application.dataPath + "/Raw/";  
  14. #elif UNITY_STANDALONE_WIN || UNITY_EDITOR  
  15.     "file://" + Application.dataPath + "/StreamingAssets/";  
  16. #else  
  17.         string.Empty;  
  18. #endif  
  19.       
  20.     void OnGUI()  
  21.     {  
  22.         if(GUILayout.Button("Main Assetbundle"))  
  23.         {  
  24.             //StartCoroutine(LoadMainGameObject(PathURL + "Prefab0.assetbundle"));  
  25.             //StartCoroutine(LoadMainGameObject(PathURL +  "Prefab1.assetbundle"));  
  26.           
  27.             StartCoroutine(LoadMainCacheGameObject(PathURL + "Prefab0.assetbundle"));  
  28.             StartCoroutine(LoadMainCacheGameObject(PathURL +  "Prefab1.assetbundle"));  
  29.         }  
  30.           
  31.         if(GUILayout.Button("ALL Assetbundle"))  
  32.         {  
  33.             StartCoroutine(LoadALLGameObject(PathURL + "ALL.assetbundle"));  
  34.         }  
  35.           
  36.         if(GUILayout.Button("Open Scene"))  
  37.         {  
  38.             StartCoroutine(LoadScene());  
  39.         }  
  40.           
  41.     }  
  42.       
  43.     //读取一个资源  
  44.       
  45.     private IEnumerator LoadMainGameObject(string path)  
  46.     {  
  47.          WWW bundle = new WWW(path);  
  48.            
  49.          yield return bundle;  
  50.            
  51.          //加载到游戏中  
  52.          yield return Instantiate(bundle.assetBundle.mainAsset);  
  53.            
  54.          bundle.assetBundle.Unload(false);  
  55.     }  
  56.       
  57.     //读取全部资源  
  58.       
  59.     private IEnumerator LoadALLGameObject(string path)  
  60.     {  
  61.          WWW bundle = new WWW(path);  
  62.            
  63.          yield return bundle;  
  64.            
  65.          //通过Prefab的名称把他们都读取出来  
  66.          Object  obj0 =  bundle.assetBundle.Load("Prefab0");  
  67.          Object  obj1 =  bundle.assetBundle.Load("Prefab1");  
  68.           
  69.          //加载到游戏中     
  70.          yield return Instantiate(obj0);  
  71.          yield return Instantiate(obj1);  
  72.          bundle.assetBundle.Unload(false);  
  73.     }  
  74.       
  75.     private IEnumerator LoadMainCacheGameObject(string path)  
  76.     {  
  77.          WWW bundle = WWW.LoadFromCacheOrDownload(path,5);  
  78.            
  79.          yield return bundle;  
  80.            
  81.          //加载到游戏中  
  82.          yield return Instantiate(bundle.assetBundle.mainAsset);  
  83.            
  84.          bundle.assetBundle.Unload(false);  
  85.     }  
  86.       
  87.       
  88.     private IEnumerator LoadScene()  
  89.     {  
  90.          WWW download = WWW.LoadFromCacheOrDownload ("file://"+Application.dataPath + "/MyScene.unity3d", 1);  
  91.               
  92.           yield return download;  
  93.           var bundle = download.assetBundle;  
  94.           Application.LoadLevel ("Level");  
  95.     }  
  96. }  


如果assetbundle文件放在服务器端,直接用www.loadfromcacheordownload()通过版本来控制是否从服务器下载并保存到本地。本人亲自测试,这个方法是能下载到本地的,至于下载在本地哪儿我就不太清楚了,希望知道的同志们告知一下!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽B代驾管理系统对代驾订单管理、用户咨询管理、代驾订单评价管理、代驾订单投诉管理、字典管理、论坛管理、公告管理、新闻信息管理、司机管理、用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行辽B代驾管理系统程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。辽B代驾管理系统的开发让用户查看代驾订单信息变得容易,让管理员高效管理代驾订单信息。 辽B代驾管理系统具有管理员角色,用户角色,这几个操作权限。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看代驾订单,删除代驾订单操作,新增代驾订单操作,修改代驾订单操作。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。新闻管理页面,此页面提供给管理员的功能有:新增新闻,修改新闻,删除新闻。新闻类型管理页面,此页面提供给管理员的功能有:新增新闻类型,修改新闻类型,删除新闻类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值