【Unity】AssetBundle 资源打包和依赖资源打包

转载地址:http://blog.csdn.net/yxingyeyouyu/article/details/42921499

前段时间做了一个项目,刚好使用到了AssetBundle资源打包的东西,于是花了点时间研究了一下AssetBundle.

AssetBundle 打包

   我用NGUI插件加载了一张图片,并且把它拖拽为预制名为Texture3.prefab  和 Texture4.prefab .下面是我的打包函数

[csharp]  view plain copy print ?
  1. [MenuItem("Assets/Build AssetBundle From Selection - Track dependencies")]  
  2.         static void ExportResource () {  
  3.             // 打开保存面板,获得选择的路径   
  4.             string path = EditorUtility.SaveFilePanel ("Save Resource""""New Resource""unity3d");  
  5.             if (path.Length != 0) {  
  6.                 // 选择要保存的对象  
  7.                 Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);  
  8.                 //开始打包  
  9.                 BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets,BuildTarget.StandaloneWindows);  
  10.   
  11.                 //打包完成提示  
  12.                 EditorUtility.DisplayDialog("""Build Completed""OK");  
  13.                 //刷新资源目录  
  14.                 AssetDatabase.Refresh();  
  15.             }  
  16.         }  

说明一下:  

1.我们打包的资源的后缀格式可以是 ".assetbundle" 或者 ".unity3d" 。笔者这里使用的是后者  

2. 解释一下打包函数的参数,第一个参数 Selection.activeObject 是我们打包的mainAsset ,

第二个参数 selection 是我们选择的对象过滤后的物体,可以为空,第三个参数 path 是 打包的资源的

保存路径 ,第四个参数是打包选项 ,我这里选用的两个选项 分别代表 打包所有有关联的对象和强制

打包全部的资源,详情请查找API文档 第五个参数是打包的平台。 


 


AssetBundle加载

下面是我写的加载函数:

[csharp]  view plain copy print ?
  1. public string[] textureName;  
  2.     // Use this for initialization  
  3.     void Start () {  
  4.         for (int i = 0; i < textureName.Length; i++)  
  5.         {  
  6.             StartCoroutine(LoadAssetBundle(PlatflamPath() + textureName[i] + ".unity3d", textureName[i]));  
  7.         }         
  8.     }    
  9.   
  10.     static public IEnumerator LoadAssetBundle(string filepath,string assetName) {   
  11.         WWW www = new WWW(filepath);  
  12.         yield return www;  
  13.   
  14.         if (www == null) {  
  15.             Debug.Log(" www is null ");  
  16.         }  
  17.         else if (www.error != null) {  
  18.             Debug.Log("error " + www.error);  
  19.         }  
  20.         else if (www.isDone) {  
  21.             AssetBundle assetBundle = www.assetBundle;  
  22.   
  23.             AssetBundleRequest requet = assetBundle.LoadAsync(assetName, typeof(GameObject));  
  24.             yield return requet;  
  25.   
  26.             if (requet.isDone) {  
  27.                 GameObject obj = Instantiate(requet.asset) as GameObject;      
  28.             }              
  29.         }  
  30.         www.Dispose();  
  31.         www = null;  
  32.     }  
  33.     static public string PlatflamPath()  
  34.     {  
  35.         return string.Format("file://{0}", Application.streamingAssetsPath) + "/";  
  36.     }  


【Unity】AssetBundle 资源打包和依赖资源打包_第1张图片


AssetBundle依赖资源\共享资源打包


      上面的两个预制都是用了同一张图片,我们可以将这张图片打到没一个包里面去,我们上面将的就是这种情况。这样子做的话有些弊端,比如内存有点让费,并且当这张图片有所改变的时候,两个包需要重新打包。当然,我们也可以使用AssetBundle的依赖资源\共享资源进行打包。主要会使用到下面两个函数,
      BuildPipeline.PushAssetDependencies():依赖资源压栈;


  BuildPipeline.PopAssetDependencies():依赖资源出栈。


      笔者将上表面的Texture3.prefab复制了两份,改为Texture1.prefab 和 Texture2.prefab。还准备好预制的图片

下面是我的打包函数:

[csharp]  view plain copy print ?
  1. [MenuItem("Assets/Build Rely AssetBundle")]  
  2.         static public void ExportRelyAssetBundle() {  
  3.             string filePath = Application.streamingAssetsPath+"/";  
  4.             if (filePath.Length <= 0) {  
  5.                 return;  
  6.             }  
  7.   
  8.             BuildAssetBundleOptions buildOp = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets  
  9.             | BuildAssetBundleOptions.DeterministicAssetBundle;  
  10.   
  11.             BuildPipeline.PushAssetDependencies();  
  12.   
  13.                 Object shared = AssetDatabase.LoadMainAssetAtPath("Assets/Textures/rainDrop.png");  
  14.                 BuildPipeline.BuildAssetBundle(shared, null, filePath + shared.name + ".unity3d", buildOp, BuildTarget.StandaloneWindows);  
  15.   
  16.                 BuildPipeline.PushAssetDependencies();  
  17.                     Object tex1 = AssetDatabase.LoadMainAssetAtPath("Assets/Textures/Texture1.prefab");  
  18.                     BuildPipeline.BuildAssetBundle(tex1, null, filePath + tex1.name + ".unity3d", buildOp, BuildTarget.StandaloneWindows);  
  19.                 BuildPipeline.PopAssetDependencies();  
  20.   
  21.                 BuildPipeline.PushAssetDependencies();  
  22.                     Object tex2 = AssetDatabase.LoadMainAssetAtPath("Assets/Textures/Texture2.prefab");  
  23.                     BuildPipeline.BuildAssetBundle(tex2, null, filePath + tex2.name + ".unity3d", buildOp, BuildTarget.StandaloneWindows);  
  24.                 BuildPipeline.PopAssetDependencies();  
  25.                   
  26.             BuildPipeline.PopAssetDependencies();  
  27.   
  28.             EditorUtility.DisplayDialog("""Build Completed""OK");  
  29.             AssetDatabase.Refresh();  
  30.         }  


【Unity】AssetBundle 资源打包和依赖资源打包_第2张图片

AssetBundle依赖资源\共享资源加载

[csharp]  view plain copy print ?
  1. public string[] textureName;  
  2.     public string picName;  
  3.     // Use this for initialization  
  4.     void Start () {  
  5.         if (picName.Length > 0)  
  6.         {  
  7.             StartCoroutine(LoadAssetTexture(PlatflamPath() + picName + ".unity3d", picName));  
  8.         }  
  9.   
  10.         for (int i = 0; i < textureName.Length; i++)  
  11.         {  
  12.             StartCoroutine(LoadAssetBundle(PlatflamPath() + textureName[i] + ".unity3d", textureName[i]));  
  13.         }          
  14.     }    
  15.   
  16.     static public IEnumerator LoadAssetBundle(string filepath,string assetName) {   
  17.         WWW www = new WWW(filepath);  
  18.         yield return www;  
  19.   
  20.         if (www == null) {  
  21.             Debug.Log(" www is null ");  
  22.         }  
  23.         else if (www.error != null) {  
  24.             Debug.Log("error " + www.error);  
  25.         }  
  26.         else if (www.isDone) {  
  27.             AssetBundle assetBundle = www.assetBundle;  
  28.   
  29.             AssetBundleRequest requet = assetBundle.LoadAsync(assetName, typeof(GameObject));  
  30.             yield return requet;  
  31.   
  32.             if (requet.isDone) {  
  33.                 GameObject obj = Instantiate(requet.asset) as GameObject;      
  34.             }              
  35.         }  
  36.   
  37.         www.Dispose();  
  38.         www = null;  
  39.     }  
  40.   
  41.     static public string PlatflamPath()  
  42.     {  
  43.         return string.Format("file://{0}", Application.streamingAssetsPath) + "/";  
  44.     }  
  45.   
  46.     static public IEnumerator LoadAssetTexture(string filepath, string assetName)  
  47.     {  
  48.         WWW www = new WWW(filepath);  
  49.         yield return www;  
  50.   
  51.         if (www == null)  
  52.         {  
  53.             Debug.Log(" www is null ");  
  54.         }  
  55.         else if (www.error != null)  
  56.         {  
  57.             Debug.Log("error " + www.error);  
  58.         }  
  59.         else if (www.isDone)  
  60.         {  
  61.             AssetBundle assetBundle = www.assetBundle;  
  62.         }  
  63.   
  64.         www.Dispose();  
  65.         www = null;  
  66.     }  


【Unity】AssetBundle 资源打包和依赖资源打包_第3张图片


注意事项:

加载的时候需要加载图片,再加载跟它有关联的对象,笔者试过先加载后者,图片资源会丢失。
       另外,Push和Pos都是成对使用。

相比之下,后者打包的方式前者节省空间。具体使用情况还是视个人情况而定。


你可能感兴趣的:(【Unity】AssetBundle 资源打包和依赖资源打包)