上篇文章中實現了基本的打包功能,在這篇我們來解決不同平臺打 AB 包的問題。
本篇文章的核心 api 還是:
```cs
BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget);
```
在第三個參數中,只要傳入不同平臺 BuildTarget 就可以了。目前只考慮 Android 和 iOS 平臺。
## 區分 iOS、Android 平臺
很簡單,只要在上篇文章的 QABEditor 類中將原來的 BuildAssetBundle 方法分為 BuildAssetBundleiOS 和BuildAssetBundleAndroid 即可。代碼如下所示。
```cs
public class QABEditor
{
[MenuItem("QFramework/AB/Build iOS")]
public static void BuildABiOS()
{
string outputPath = QPath.ABBuildOutPutDir (RuntimePlatform.IPhonePlayer);
QIO.CreateDirIfNotExists (outputPath);
QABBuilder.BuildAssetBundles (BuildTarget.iOS);
AssetDatabase.Refresh ();
}
[MenuItem("QFramework/AB/Build Android")]
public static void BuildABAndroid()
{
string outputPath = QPath.ABBuildOutPutDir (RuntimePlatform.Android);
QIO.CreateDirIfNotExists (outputPath);
QABBuilder.BuildAssetBundles (BuildTarget.Android);
AssetDatabase.Refresh ();
}
}
```
大家覺得代碼中有幾個類有些陌生。下面我來一一介紹下。
## QPath.ABBuildOutPutDir(build target)
QPath 這個類在我的框架中是用來指定固定的路徑用的,因為路徑的代碼全是字符串,不能讓字符串暴露在各處都是,這樣會影響代碼的可讀性。統一管理起來比較方便修改。ABBuildOutPutDir 這個 API 的實現如下所示,就不多說了。
```cs
/// <summary>
/// 所有的路徑常量都在這里
/// </summary>
public class QPath
{
/// <summary>
/// 資源輸出的路徑
/// </summary>
public static string ABBuildOutPutDir(RuntimePlatform platform)
{
string retDirPath = null;
switch (platform)
{
case RuntimePlatform.Android:
retDirPath = Application.streamingAssetsPath + "/QAB/Android";
break;
case RuntimePlatform.IPhonePlayer:
retDirPath = Application.streamingAssetsPath + "/QAB/iOS";
break;
case RuntimePlatform.WindowsPlayer:
case RuntimePlatform.WindowsEditor:
retDirPath = Application.streamingAssetsPath + "/QAB/Windows";
break;
case RuntimePlatform.OSXPlayer:
case RuntimePlatform.OSXEditor:
retDirPath = Application.streamingAssetsPath + "/QAB/OSX";
break;
}
return retDirPath;
}
/// <summary>
/// 打包之前的源資源文件
/// </summary>
public static string SrcABDir
{
get
{
return Application.dataPath + "/QArt/QAB";
}
}
}
}
```
## QIO.CreateDirIfNotExists (outputPath)
QIO 這個類是用來封裝 C# 的 System.IO 和一些文件操作相關的 API。CreateDirIfNotExists 這個命名非常的傻瓜,會點英文就應該可以理解了。下面貼出實現代碼,
```cs
using UnityEngine;
using System.Collections;
using System.IO;
/// <summary>
/// 各種文件的讀寫復制操作,主要是對System.IO的一些封裝
/// </summary>
namespace QFramework
{
public class QIO
{
/// <summary>
/// 創建新的文件夾,如果存在則不創建
/// </summary>
public static void CreateDirIfNotExists(string dirFullPath)
{
if (!Directory.Exists (dirFullPath))
{
Directory.CreateDirectory (dirFullPath);
}
}
}
}
```
## QABBuilder
QABBuilder 只是封裝了本文的核心 API
```cs
BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget);
```
封裝的原因是打 AB 包成功后,要對 AB 包進行一些處理,比如計算包尺寸,計算哈希或者 md5 值。主要是為了以后的熱更新做準備的。看下 QABBuilder 核心實現.
```cs
public class QABBuilder
{
public static string overloadedDevelopmentServerURL = "";
public static void BuildAssetBundles(BuildTarget buildTarget)
{
string outputPath = Path.Combine(QPlatform.ABundlesOutputPath, QPlatform.GetPlatformName());
if (Directory.Exists (outputPath)) {
Directory.Delete (outputPath,true);
}
Directory.CreateDirectory (outputPath);
BuildPipeline.BuildAssetBundles(outputPath,BuildAssetBundleOptions.None,buildTarget);
GenerateVersionConfig (outputPath);
if(Directory.Exists(Application.streamingAssetsPath+"/QAB")){
Directory.Delete (Application.streamingAssetsPath+"/QAB",true);
}
Directory.CreateDirectory (Application.streamingAssetsPath+"/QAB");
FileUtil.ReplaceDirectory (QPlatform.ABundlesOutputPath,Application.streamingAssetsPath+"/QAB");
AssetDatabase.Refresh ();
}
}
}
```
## 使用方式
按這里

結果看這里(創建了iOS文件夾)

介紹完畢,睡覺了!
## 歡迎討論!
轉載請注明地址:涼鞋的筆記:[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 (二十四) 小結