Unity 游戏框架搭建 (十一) 简易AssetBundle打包工具(一)

最近在看Unity官方的 AssetBundle(以下简称 AB )的教程,也照着做了一遍,不过做出来的 AssetBundleManager 的 API 设计得有些不太习惯。目前想到了一个可行的解决方案。AB 相关的内容有点多,所以为了良好的阅读体验,就把教程分为几个小文章,一次写一个点。

1. AssetBundle设置:

首先要确定一个专门打资源包用的目录,我的框架定的目录是QArt/QAB,并存放了一些Prefab资源,如下所示。11.简易AssetBundle打包工具(一)  - 图1

然后选定TestAB目录,将Inspector窗口的设置为如下图所示:

11.简易AssetBundle打包工具(一)  - 图2

一级名字为testab,二级扩展名为unity3d。这样AB就设置好了。

2. 制作编辑器工具。

这里打包的核心API只有一个,就是

  1. BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget);

贴上编辑器工具代码:

  1. using UnityEditor;
  2. using System.Collections;
  3. using UnityEngine;
  4. using System.IO;
  5. using System.Collections.Generic;
  6.  
  7. namespace QFramework.Editor {
  8.  
  9. public class QABEditor
  10. {
  11. [MenuItem("QFramework/AB/Build")]
  12. public static void BuildAssetBundle()
  13. {
  14. // AB包输出路径
  15. string outPath = Application.streamingAssetsPath + "/QAB";
  16.  
  17. // 检查路径是否存在
  18. CheckDirAndCreate (outPath);
  19.  
  20. BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget);
  21.  
  22. // 刚创建的文件夹和目录能马上再Project视窗中出现
  23. AssetDatabase.Refresh ();
  24. }
  25.  
  26. /// <summary>
  27. /// 判断路径是否存在,不存在则创建
  28. /// </summary>
  29. public static void CheckDirAndCreate(string dirPath)
  30. {
  31. if (!Directory.Exists (dirPath)) {
  32. Directory.CreateDirectory (dirPath);
  33. }
  34. }
  35. }
  36. }

这个脚本要放在Editor目录下!!!

这个脚本要放在Editor目录下!!!

这个脚本要放在Editor目录下!!!

使用方法:

点击QFramework/AB/Build

11.简易AssetBundle打包工具(一)  - 图3

之后,生成的AB包如下所示:

11.简易AssetBundle打包工具(一)  - 图4

AB包就打好了,接下来开始测试AB包的使用。

3.测试:

代码很简单,如下所示,一些常识性的问题就不介绍了。

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.IO;
  4.  
  5. namespace QFramework.Example {
  6. public class TestABEditor : MonoBehaviour {
  7.  
  8. // Use this for initialization
  9. IEnumerator Start () {
  10.  
  11. WWW www = new WWW ("file:///" + Application.streamingAssetsPath + Path.DirectorySeparatorChar + "QAssetBundle" + Path.DirectorySeparatorChar + "testab.unity3d");
  12.  
  13. yield return www;
  14.  
  15. if (string.IsNullOrEmpty (www.error)) {
  16. var go = www.assetBundle.LoadAsset<GameObject> ("Canvas");
  17.  
  18. Instantiate (go);
  19. }
  20. else {
  21. Debug.LogError (www.error);
  22. }
  23.  
  24. }
  25.  
  26. // Update is called once per frame
  27. void Update () {
  28.  
  29. }
  30. }
  31. }
运行结果:

11.简易AssetBundle打包工具(一)  - 图5

最初版的打包工具就做好了,接下来到了吐槽的时刻了。

4.存在的问题:

  • 不支持多平台,只能打当前PlayerSettings所设置的平台的AB包,有点麻烦。
  • 需要手动设置AB包的名字和扩展名,这个问题完全可以交给代码实现。
  • 看不到整个工程究竟有哪些设置了AB包的名字,哪些没设置,有些无关的资源误操作设置了AB包名,要排查这种资源要花些时间。
  • 测试的代码中暴露的字符串太多了,其中包括AB包名,AB包路径,要加载的资源名字,这些都可以集中管理或者生成代码。
  • 欢迎补充这些问题在此后的文章中一步一步解决,希望大家多给些建议。

欢迎讨论!

相关链接:

我的框架地址:https://github.com/liangxiegame/QFramework

教程源码:https://github.com/liangxiegame/QFramework/tree/master/Assets/HowToWriteUnityGameFramework/

QFramework &游戏框架搭建QQ交流群: 623597263

转载请注明地址:凉鞋的笔记http://liangxiegame.com/

微信公众号:liangxiegame

11.简易AssetBundle打包工具(一)  - 图6

如果有帮助到您:

如果觉得本篇教程对您有帮助,不妨通过以下方式赞助笔者一下,鼓励笔者继续写出更多高质量的教程,也让更多的力量加入 QFramework 。