最近在看 Unity 官方的 AssetBundle(以下簡稱 AB )的教程,也照著做了一遍,不過做出來的 AssetBundleManager 的 API 設計得有些不太習慣。目前想到了一個可行的解決方案。AB 相關的內容有點多,所以為了良好的閱讀體驗,就把教程分為幾個小文章,一次寫一個點。
## 1. AssetBundle設置:
首先要確定一個專門打資源包用的目錄,我的框架定的目錄是
QArt/QAB,并存放了一些 Prefab 資源,如下所示。

然后選定 TestAB 目錄,將 Inspector 窗口的設置為如下圖所示:

一級名字為 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

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

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 () {
}
}
}
```
### 運行結果:

最初版的打包工具就做好了,接下來到了吐槽的時刻了。
## 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 獲取第一時間更新通知及更多的免費內容。

- 正文
- Unity 游戲框架搭建 2017(一)概述
- Unity 游戲框架搭建 2017(二)單例的模板
- Unity 游戲框架搭建 2017(三)MonoBehaviour 單例的模板
- Unity 游戲框架搭建 2017(四)簡易有限狀態機
- Unity 游戲框架搭建 2017(五)簡易消息機制
- Unity 游戲框架搭建 2017 (六) 關于框架的一些好文和一些思考
- Unity 游戲框架搭建 2017 (七) 減少加班利器-QApp類
- Unity 游戲框架搭建 2017 (八) 減少加班利器-QLog
- Unity 游戲框架搭建 2017 (九) 減少加班利器-QConsole
- Unity 游戲框架搭建 2017 (十) QFramework v0.0.2小結
- Unity 游戲框架搭建 2017 (十一) 簡易 AssetBundle 打包工具 (一)
- Unity 游戲框架搭建 2017 (十二) 簡易 AssetBundle 打包工具 (二)
- Unity 游戲框架搭建 2017 (十三) 無需繼承的單例的模板
- Unity 游戲框架搭建 2017 (十四) 優雅的 QSingleton (零) QuickStart
- Unity 游戲框架搭建 2017 (十四) 優雅的 QSingleton (一) Singleton 單例實現
- Unity 游戲框架搭建 2017 (十四) 優雅的 QSingleton (二) MonoSingleton單例實現
- Unity 游戲框架搭建 2017 (十四) 優雅的 QSignleton (三) 通過屬性器實現 Singleton
- Unity 游戲框架搭建 2017 (十四) 優雅的 QSingleton (四) 屬性器實現 Mono 單例
- Unity 游戲框架搭建 2017 (十四) 優雅的 QSingleton (五) 優雅地進行GameObject命名
- Unity 游戲框架搭建 2017 (十五) 優雅的 QChain (零)
- Unity 游戲框架搭建 2017 (十六) v0.0.3 架構調整
- Unity 游戲框架搭建 2017 (十七) 靜態擴展GameObject 實現鏈式編程
- Unity 游戲框架搭建 2017 (十八) 靜態擴展 + 泛型實現 transform 的鏈式編程
- Unity 游戲框架搭建 2017 (十九) 簡易對象池
- Unity 游戲框架搭建 2017 (二十) 安全的對象池
- Unity 游戲框架搭建 2017 (二十一) 使用對象池時的一些細節
- Unity 游戲框架搭建 2017 (二十二) 簡易引用計數器
- Unity 游戲框架搭建 2017 (二十三) 重構小工具 Platform
- Unity 游戲框架搭建 2017 (二十四) 小結