[Unity3d]打包Assetbundle并加载

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


说下使用方法:

1、把附件脚本放到工程文件夹下的...\Assets\Editor文件夹下。

2、在工程的Project视图里点击想要保存的资源,网络上推荐的是Prefab,右键点击,选择菜单里最下面的两个选项任意一个都可以,第一个选项对应的自定义属性有一个过期了,但是不影响使用。

3、指定文件的构建路径和文件后缀,后缀无所谓。

4、推荐制造做法:

任何形式的资源都可以,包括集合资源,比如创建一个空的GameObject,把所有想要关联的其他GameObject都拖进去,然后在project视图里创建一个prefab,将这个集合资源GameObject拖进去作为一个prefab。执行上面的第2、3步骤。


官方的讲解:http://game.ceeger.com/Script/BuildPipeline/BuildPipeline.BuildAssetBundle.html


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

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  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的脚本

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  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

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  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()通过版本来控制是否从服务器下载并保存到本地。本人亲自测试,这个方法是能下载到本地的,至于下载在本地哪儿我就不太清楚了,我猜测应该是存在沙盒文件下(移动开发者的朋友应该知道),当然也可以自己来做版本控制,那样更灵活,并且摆脱www.loadfromcacheordownload()方法的束缚,貌似这个方法存贮文件是有空间大小限制的,据说是50M,本人没有亲自考证,后期我会自己做一个版本控制!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值