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

来源:互联网 发布:阿里云服务器安全配置 编辑:程序博客网 时间:2024/05/29 09:57
上篇文章中实现了基本的打包功能,在这篇我们来解决不同平台打AB包的问题。 本篇文章的核心api还是:


[C#] 纯文本查看 复制代码
?
 
BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget);    

在第三个参数中,只要传入不同平台 BuildTarget就可以了。目前只考虑和iOS平台。

区分iOS、Android平台:
  很简单,只要在上篇文章的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
publicclass QABEditor
        {
                [MenuItem("QFramework/AB/Build iOS")]
                publicstatic void BuildABiOS()
                {
                        stringoutputPath = QPath.ABBuildOutPutDir (RuntimePlatform.IPhonePlayer);
 
                        QIO.CreateDirIfNotExists (outputPath);
 
                        QABBuilder.BuildAssetBundles (BuildTarget.iOS);
 
                        AssetDatabase.Refresh ();
                }
 
                [MenuItem("QFramework/AB/Build Android")]
                publicstatic void BuildABAndroid()
                {
                        stringoutputPath = QPath.ABBuildOutPutDir (RuntimePlatform.Android);
                                 
                        QIO.CreateDirIfNotExists (outputPath);
 
                        QABBuilder.BuildAssetBundles (BuildTarget.Android);
 
                        AssetDatabase.Refresh ();
 
                }
}

大家觉得代码中有几个类有些陌生。下面我来一一介绍下。

QPath.ABBuildOutPutDir(build target):
  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>
        publicclass QPath
        {
                /// <summary>
                /// 资源输出的路径
                /// </summary>
                publicstatic string ABBuildOutPutDir(RuntimePlatform platform) {
                        stringretDirPath = null;
                        switch(platform) {
                        caseRuntimePlatform.Android:
                                retDirPath = Application.streamingAssetsPath + "/QAB/Android";
                                break;
                        caseRuntimePlatform.IPhonePlayer:
                                retDirPath = Application.streamingAssetsPath + "/QAB/iOS";
                                break;
                        caseRuntimePlatform.WindowsPlayer:
                        caseRuntimePlatform.WindowsEditor:
                                retDirPath = Application.streamingAssetsPath + "/QAB/Windows";
                                break;
                        caseRuntimePlatform.OSXPlayer:
                        caseRuntimePlatform.OSXEditor:
                                retDirPath = Application.streamingAssetsPath + "/QAB/OSX";
                                break;
                        }
 
                        returnretDirPath;
                }
 
                /// <summary>
                /// 打包之前的源资源文件
                /// </summary>
                publicstatic string SrcABDir  {
                        get{
                                returnApplication.dataPath + "/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
usingUnityEngine;
usingSystem.Collections;
usingSystem.IO;
 
/// <summary>
/// 各种文件的读写复制操作,主要是对System.IO的一些封装
/// </summary>
namespaceQFramework {
         
        publicclass QIO {
 
                /// <summary>
                /// 创建新的文件夹,如果存在则不创建
                /// </summary>
                publicstatic void CreateDirIfNotExists(stringdirFullPath)
                {
                        if(!Directory.Exists (dirFullPath)) {
                                Directory.CreateDirectory (dirFullPath);
                        }
                }
        }
}

QABBuilder:
  QABBuilder只是封装了本文的核心API
[C#] 纯文本查看 复制代码
?
 
BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget); 
  封装的原因是打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
        publicclass QABBuilder
        {
                publicstatic string overloadedDevelopmentServerURL = "";
 
 
                publicstatic void BuildAssetBundles(BuildTarget buildTarget)
                {
                        stringoutputPath = 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 ();
                }
    }
}
 
        {
                publicstatic string overloadedDevelopmentServerURL = "";
 
 
                publicstatic void BuildAssetBundles(BuildTarget buildTarget)
                {
                        stringoutputPath = 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文件夹)
介绍完毕,睡觉了!

附:我的框架地址:https://github.com/liangxiegame/QFramework
转载请注明地址:凉鞋的笔记:http://liangxiegame.com/
0 0
原创粉丝点击