🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
最近在看 Unity 官方的 AssetBundle(以下简称 AB )的教程,也照着做了一遍,不过做出来的 AssetBundleManager 的 API 设计得有些不太习惯。目前想到了一个可行的解决方案。AB 相关的内容有点多,所以为了良好的阅读体验,就把教程分为几个小文章,一次写一个点。 ## 1. AssetBundle设置: 首先要确定一个专门打资源包用的目录,我的框架定的目录是 QArt/QAB,并存放了一些 Prefab 资源,如下所示。 ![DraggedImage.png](http://file.liangxiegame.com/488e7887-739c-4500-b2da-a3cc3f2af3b0.png) 然后选定 TestAB 目录,将 Inspector 窗口的设置为如下图所示: ![DraggedImage-1.png](http://file.liangxiegame.com/5a6fe965-dd23-4ac3-a27f-fee4caba1d55.png) 一级名字为 testab,二级扩展名为 unity3d。 这样 AB 就设置好了。 ## 2. 制作编辑器工具。 这里打包的核心 API 只有一个,就是 ```cs BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget); ``` 贴上编辑器工具代码: ```cs using UnityEditor; using System.Collections; using UnityEngine; using System.IO; using System.Collections.Generic; namespace QFramework.Editor { public class QABEditor { [MenuItem("QFramework/AB/Build")] public static void BuildAssetBundle() { // AB包输出路径 string outPath = Application.streamingAssetsPath + "/QAB"; // 检查路径是否存在 CheckDirAndCreate (outPath); BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget); // 刚创建的文件夹和目录能马上在 Project 视窗中出现 AssetDatabase.Refresh (); } /// <summary> /// 判断路径是否存在,不存在则创建 /// </summary> public static void CheckDirAndCreate(string dirPath) { if (!Directory.Exists (dirPath)) { Directory.CreateDirectory (dirPath); } } } } ``` **这个脚本要放在 Editor 目录下!!!** **这个脚本要放在 Editor 目录下!!!** **这个脚本要放在 Editor 目录下!!!** ## 使用方法: 点击QFramework/AB/Build ![DraggedImage-2.png](http://file.liangxiegame.com/d45867d3-4d67-4011-b2e2-5c575dc04709.png) 之后,生成的AB包如下所示: ![DraggedImage-3.png](http://file.liangxiegame.com/90eac9b9-6319-41a3-ae59-173e68fd493c.png) AB包就打好了,接下来开始测试AB包的使用。 ## 3.测试: 代码很简单,如下所示,一些常识性的问题就不介绍了。 ```cs using UnityEngine; using System.Collections; using System.IO; namespace QFramework.Example { public class TestABEditor : MonoBehaviour { // Use this for initialization IEnumerator Start () { WWW www = new WWW ("file:///" + Application.streamingAssetsPath + Path.DirectorySeparatorChar + "QAssetBundle" + Path.DirectorySeparatorChar + "testab.unity3d"); yield return www; if (string.IsNullOrEmpty (www.error)) { var go = www.assetBundle.LoadAsset<GameObject> ("Canvas"); Instantiate (go); } else { Debug.LogError (www.error); } } // Update is called once per frame void Update () { } } } ``` ### 运行结果: ![DraggedImage-4.png](http://file.liangxiegame.com/e394b3e5-58cf-437a-944a-9131018ab5fc.png) 最初版的打包工具就做好了,接下来到了吐槽的时刻了。 ## 4.存在的问题: 1. 不支持多平台,只能打当前 PlayerSettings 所设置的平台的 AB 包,有点麻烦。 2. 需要手动设置 AB 包的名字和扩展名,这个问题完全可以交给代码实现。 3. 看不到整个工程究竟有哪些设置了AB 包的名字,哪些没设置,有些无关的资源误操作设置了AB 包名,要排查这种资源要花些时间。 4. 测试的代码中暴露的字符串太多了,其中包括 AB 包名,AB 包路径,要加载的资源名字,这些都可以集中管理或者生成代码。 5. 欢迎补充 这些问题在此后的文章中一步一步解决,希望大家多给些建议。 ## 欢迎讨论! 转载请注明地址:凉鞋的笔记:[liangxiegame.com](http://liangxiegame.com) ## 更多内容 * QFramework 地址:[https://github.com/liangxiegame/QFramework](https://github.com/liangxiegame/QFramework) * QQ 交流群:[623597263](http://shang.qq.com/wpa/qunwpa?idkey=706b8eef0fff3fe4be9ce27c8702ad7d8cc1bceabe3b7c0430ec9559b3a9ce66) * **Unity 进阶小班**: * 主要训练内容: * 框架搭建训练(第一年) * 跟着案例学 Shader(第一年) * 副业的孵化(第二年、第三年) * 权益、授课形式等具体详情请查看[《小班产品手册》](https://liangxiegame.com/master/intro):https://liangxiegame.com/master/intro * 关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。 ![](http://file.liangxiegame.com/38eccb55-40b2-4845-93d6-f5fb50ff9492.png)