AssetBundle------ 资源打包和依赖资源打包
来源:互联网 发布:ios网络手游推荐 编辑:程序博客网 时间:2024/05/22 02:35
前段时间做了一个项目,刚好使用到了AssetBundle资源打包的东西,于是花了点时间研究了一下AssetBundle.
AssetBundle 打包
我用NGUI插件加载了一张图片,并且把它拖拽为预制名为Texture3.prefab 和 Texture4.prefab .下面是我的打包函数
[MenuItem("Assets/Build AssetBundle From Selection - Track dependencies")] static void ExportResource () { // 打开保存面板,获得选择的路径 string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d"); if (path.Length != 0) { // 选择要保存的对象 Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets); //开始打包 BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets,BuildTarget.StandaloneWindows); //打包完成提示 EditorUtility.DisplayDialog("", "Build Completed", "OK"); //刷新资源目录 AssetDatabase.Refresh(); } }
说明一下:
1.我们打包的资源的后缀格式可以是 ".assetbundle" 或者 ".unity3d" 。笔者这里使用的是后者
2. 解释一下打包函数的参数,第一个参数 Selection.activeObject 是我们打包的mainAsset ,
第二个参数 selection 是我们选择的对象过滤后的物体,可以为空,第三个参数 path 是 打包的资源的
保存路径 ,第四个参数是打包选项 ,我这里选用的两个选项 分别代表 打包所有有关联的对象和强制
打包全部的资源,详情请查找API文档 第五个参数是打包的平台。
AssetBundle加载
下面是我写的加载函数:
public string[] textureName;// Use this for initializationvoid Start () { for (int i = 0; i < textureName.Length; i++) { StartCoroutine(LoadAssetBundle(PlatflamPath() + textureName[i] + ".unity3d", textureName[i])); } } static public IEnumerator LoadAssetBundle(string filepath,string assetName) { WWW www = new WWW(filepath); yield return www; if (www == null) { Debug.Log(" www is null "); } else if (www.error != null) { Debug.Log("error " + www.error); } else if (www.isDone) { AssetBundle assetBundle = www.assetBundle; AssetBundleRequest requet = assetBundle.LoadAsync(assetName, typeof(GameObject)); yield return requet; if (requet.isDone) { GameObject obj = Instantiate(requet.asset) as GameObject; } } www.Dispose(); www = null; } static public string PlatflamPath() { return string.Format("file://{0}", Application.streamingAssetsPath) + "/"; }
AssetBundle依赖资源\共享资源打包
上面的两个预制都是用了同一张图片,我们可以将这张图片打到没一个包里面去,我们上面将的就是这种情况。这样子做的话有些弊端,比如内存有点让费,并且当这张图片有所改变的时候,两个包需要重新打包。当然,我们也可以使用AssetBundle的依赖资源\共享资源进行打包。主要会使用到下面两个函数,
BuildPipeline.PushAssetDependencies():依赖资源压栈;
BuildPipeline.PopAssetDependencies():依赖资源出栈。
笔者将上表面的Texture3.prefab复制了两份,改为Texture1.prefab 和 Texture2.prefab。还准备好预制的图片
下面是我的打包函数:
[MenuItem("Assets/Build Rely AssetBundle")] static public void ExportRelyAssetBundle() { string filePath = Application.streamingAssetsPath+"/"; if (filePath.Length <= 0) { return; } BuildAssetBundleOptions buildOp = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.DeterministicAssetBundle; BuildPipeline.PushAssetDependencies(); Object shared = AssetDatabase.LoadMainAssetAtPath("Assets/Textures/rainDrop.png"); BuildPipeline.BuildAssetBundle(shared, null, filePath + shared.name + ".unity3d", buildOp, BuildTarget.StandaloneWindows); BuildPipeline.PushAssetDependencies(); Object tex1 = AssetDatabase.LoadMainAssetAtPath("Assets/Textures/Texture1.prefab"); BuildPipeline.BuildAssetBundle(tex1, null, filePath + tex1.name + ".unity3d", buildOp, BuildTarget.StandaloneWindows); BuildPipeline.PopAssetDependencies(); BuildPipeline.PushAssetDependencies(); Object tex2 = AssetDatabase.LoadMainAssetAtPath("Assets/Textures/Texture2.prefab"); BuildPipeline.BuildAssetBundle(tex2, null, filePath + tex2.name + ".unity3d", buildOp, BuildTarget.StandaloneWindows); BuildPipeline.PopAssetDependencies(); BuildPipeline.PopAssetDependencies(); EditorUtility.DisplayDialog("", "Build Completed", "OK"); AssetDatabase.Refresh(); }
AssetBundle依赖资源\共享资源加载
public string[] textureName; public string picName;// Use this for initializationvoid Start () { if (picName.Length > 0) { StartCoroutine(LoadAssetTexture(PlatflamPath() + picName + ".unity3d", picName)); } for (int i = 0; i < textureName.Length; i++) { StartCoroutine(LoadAssetBundle(PlatflamPath() + textureName[i] + ".unity3d", textureName[i])); } } static public IEnumerator LoadAssetBundle(string filepath,string assetName) { WWW www = new WWW(filepath); yield return www; if (www == null) { Debug.Log(" www is null "); } else if (www.error != null) { Debug.Log("error " + www.error); } else if (www.isDone) { AssetBundle assetBundle = www.assetBundle; AssetBundleRequest requet = assetBundle.LoadAsync(assetName, typeof(GameObject)); yield return requet; if (requet.isDone) { GameObject obj = Instantiate(requet.asset) as GameObject; } } www.Dispose(); www = null; } static public string PlatflamPath() { return string.Format("file://{0}", Application.streamingAssetsPath) + "/"; } static public IEnumerator LoadAssetTexture(string filepath, string assetName) { WWW www = new WWW(filepath); yield return www; if (www == null) { Debug.Log(" www is null "); } else if (www.error != null) { Debug.Log("error " + www.error); } else if (www.isDone) { AssetBundle assetBundle = www.assetBundle; } www.Dispose(); www = null; }
注意事项:
加载的时候需要加载图片,再加载跟它有关联的对象,笔者试过先加载后者,图片资源会丢失。另外,Push和Pos都是成对使用。
相比之下,后者打包的方式前者节省空间。具体使用情况还是视个人情况而定。
吐槽一下,第一次写博客,没想到写个博客都这么麻烦,写博客确实不是那么的简单。刚看了一下草稿,我了勒个去,排版简直不能看,还是默默的排版去。
参考博客 :AssetBundle系列——共享资源打包/依赖资源打包
Unity手游之路<十一>资源打包Assetbundle
- AssetBundle------ 资源打包和依赖资源打包
- 【Unity】AssetBundle 资源打包和依赖资源打包
- Unity AssetBundle资源打包,Depend依赖关系
- AssetBundle系列——共享资源打包/依赖资源打包
- Unity3D之AssetBundle【7】共享资源打包/依赖资源打包
- AssetBundle系列——共享资源打包/依赖资源打包
- Unity 资源打包Assetbundle
- 资源打包Assetbundle
- AssetBundle打包资源
- 资源打包Assetbundle
- Unity 资源打包Assetbundle
- Unity 资源打包Assetbundle
- Unity3D-资源打包AssetBundle
- Unity资源打包Assetbundle
- 资源打包Assetbundle
- AssetBundle资源打包
- 资源打包Assetbundle
- [资源]AssetBundle打包
- 计算机顶级论文
- OpenCV单目标定
- Python学习:tuple
- 安卓--画廊(Gallery)组件
- Avoid The Lakes POJ
- AssetBundle------ 资源打包和依赖资源打包
- freeMark全解
- GetRecordCount()返回记录条数为啥总为-1
- 对数据分布进行可视化的方法
- 获得路由器pin码
- MySQL绿色解压缩版安装与配置
- ibatis学习资料
- 解决NDK Unresolved inclusion
- 关注无深度图的视点绘制技术