上篇文章中实现了基本的打包功能,在这篇我们来解决不同平台打AB包的问题。 本篇文章的核心api还是:
[C#]
纯文本查看
复制代码
|
BuildPipeline.BuildAssetBundles
|
在第三个参数中,只要传入不同平台 BuildTarget就可以了。目前只考虑和iOS平台。
很简单,只要在上篇文章的QABEditor类中将原来的BuildAssetBundle方法分为BuildAssetBundleiOS和BuildAssetBundleAndroid即可。代码如下所示。
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public
QABEditor
{
[MenuItem(
"QFramework/AB/Build iOS"
)]
public
void
BuildABiOS()
{
string
QIO.CreateDirIfNotExists (outputPath);
QABBuilder.BuildAssetBundles (BuildTarget.iOS);
AssetDatabase.Refresh ();
}
[MenuItem(
"QFramework/AB/Build Android"
)]
public
void
BuildABAndroid()
{
string
QIO.CreateDirIfNotExists (outputPath);
QABBuilder.BuildAssetBundles (BuildTarget.Android);
AssetDatabase.Refresh ();
}
}
|
大家觉得代码中有几个类有些陌生。下面我来一一介绍下。
QPath这个类在我的框架中是用来指定固定的路径用的,因为路径的代码全是字符串,不能让字符串暴露在各处都是,这样会影响代码的可读性。统一管理起来比较方便修改。这个ABBuildOutPutDir这个API的实现如下所示,就不多说了。
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
/// <summary>
/// 所有的路径常量都在这里
/// </summary>
public
QPath
{
/// <summary>
/// 资源输出的路径
/// </summary>
public
string
ABBuildOutPutDir(RuntimePlatform platform) {
string
null
;
switch
case
retDirPath = Application.streamingAssetsPath +
"/QAB/Android"
;
break
;
case
retDirPath = Application.streamingAssetsPath +
"/QAB/iOS"
;
break
;
case
case
retDirPath = Application.streamingAssetsPath +
"/QAB/Windows"
;
break
;
case
case
retDirPath = Application.streamingAssetsPath +
"/QAB/OSX"
;
break
;
}
return
}
/// <summary>
/// 打包之前的源资源文件
/// </summary>
public
string
SrcABDir {
get
return
"/QArt/QAB"
;
}
}
}
}
|
QIO.CreateDirIfNotExists (outputPath):
QIO这个类是用来封装C#的System.IO和一些文件操作相关的API。CreateDirIfNotExists这个命名非常的傻瓜,会点英文就应该可以理解了。下面贴出实现代码,
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
using
using
using
///
///
///
namespace
public
QIO {
/// <summary>
/// 创建新的文件夹,如果存在则不创建
/// </summary>
public
void
CreateDirIfNotExists(
string
{
if
Directory.CreateDirectory (dirFullPath);
}
}
}
}
|
QABBuilder:
QABBuilder只是封装了本文的核心API
[C#]
纯文本查看
复制代码
|
BuildPipeline.BuildAssetBundles
|
封装的原因是打AB包成功后,要对AB包进行一些处理,比如计算包尺寸,计算哈希或者md5值。主要是为了以后的热更新做准备的。看下QABBuilder核心实现.
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
public
QABBuilder
{
public
string
overloadedDevelopmentServerURL =
""
;
public
void
BuildAssetBundles(BuildTarget buildTarget)
{
string
if
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 ();
}
}
}
{
public
string
overloadedDevelopmentServerURL =
""
;
public
void
BuildAssetBundles(BuildTarget buildTarget)
{
string
if
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文件夹)
介绍完毕,睡觉了!
附:我的框架地址:https://github.com/liangxiegame/QFramework
转载请注明地址:凉鞋的笔记:http://liangxiegame.com/