上篇文章中实现了基本的打包功能,在这篇我们来解决不同平台打 AB 包的问题。

本篇文章的核心 api 还是:

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

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

区分 iOS、Android 平台

很简单,只要在上篇文章的 QABEditor 类中将原来的 BuildAssetBundle 方法分为 BuildAssetBundleiOS 和BuildAssetBundleAndroid 即可。代码如下所示。

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 的实现如下所示,就不多说了。

/// <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 这个命名非常的傻瓜,会点英文就应该可以理解了。下面贴出实现代码,

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

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

封装的原因是打 AB 包成功后,要对 AB 包进行一些处理,比如计算包尺寸,计算哈希或者 md5 值。主要是为了以后的热更新做准备的。看下 QABBuilder 核心实现.

    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

更多内容

Unity 游戏框架搭建 (十二) 简易AssetBundle打包工具(二)的更多相关文章

  1. Unity 游戏框架搭建 (十九) 简易对象池

    在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化 ...

  2. Unity 游戏框架搭建 (十) QFramework v0.0.2小结

    从框架搭建系列的第一篇文章开始到现在有四个多月时间了,这段时间对自己来说有很多的收获,好多小伙伴和前辈不管是在评论区还是私下里给出的建议非常有参考性,在此先谢过各位. 说到是一篇小节,先列出框架的概要 ...

  3. Unity 游戏框架搭建 (十六) v0.0.1 架构调整

    背景: 前段时间用Xamarin.OSX开发一些工具,遇到了两个问题. QFramework的大部分的类耦合了Unity的API,这样导致不能在其他CLR平台使用QFramework. QFramew ...

  4. Unity 游戏框架搭建 (十八) 静态扩展 + 泛型实现transform的链式编程

    本篇文章介绍如何实现如下代码的链式编程: C# this.Position(Vector3.one) .LocalScale(1.0f) .Rotation(Quaternion.identity); ...

  5. Unity 游戏框架搭建 (十五) 优雅的QChain (零)

    加班加了三个月终于喘了口气,博客很久没有更新了,这段期间框架加了很多Feature,大部分不太稳定,这些Feature中实现起来比较简单而且用的比较稳定的就是链式编程支持了. 什么是链式编程? 我想大 ...

  6. Unity 游戏框架搭建 (十四) 优雅的QSignleton(零) QuickStart

      好久不见 !之前想着让各位直接用QFramework,但是后来想想,如果正在进行的项目直接使用QFramework,这样风险太高了,要改的代码太多,所以打算陆续独立出来一些工具和模块,允许各位一个 ...

  7. Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介

    约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...

  8. Unity 游戏框架搭建 (十三) 无需继承的单例的模板

    之前的文章中介绍的Unity 游戏框架搭建 (二) 单例的模板和Unity 游戏框架搭建 (三) MonoBehaviour单例的模板有一些问题. 存在的问题: 只要继承了单例的模板就无法再继承其他的 ...

  9. Unity 游戏框架搭建 (十七) 静态扩展GameObject实现链式编程

    本篇本来是作为原来 优雅的QChain的第一篇的内容,但是QChain流产了,所以收录到了游戏框架搭建系列.本篇介绍如何实现GameObject的链式编程. 链式编程的实现技术之一是C#的静态扩展.静 ...

随机推荐

  1. 3、card 卡片

    1.基本用法的使用 /* --- htm l----*/ <ion-content> <ion-card> <ion-card-header> Header < ...

  2. sql查询某字段的相同值

    sql查询某字段的相同值: SELECT * FROM table WHERE col in (SELECT col FROM table GROUP BY col HAVING COUNT (col ...

  3. 关于Activity

    Activity与界面 1.Activity相当于浏览器的标签.相当于空白的网页,界面相当于浏览器内的网页. 2.将Activity与界面绑定就相当于在浏览器内填写了相应的网页. 3.Activity ...

  4. SharePoint 2013 - Client OM

    1. 向 executeQueryAsync 中传递参数可以使用以下两种方式,也可以参考这篇文章: var mySuccessCallBack = Function.createCallback(on ...

  5. VS中bin,app_code,app_data,app_browser,app_GlobalResources等文件夹的作用 .

    1.  Bin文件夹 Bin文件夹包含应用程序所需的,用于控件.组件或者需要引用的任何其他代码的可部署程序集.该目录中存在的任何.dll文件将自动地链接到应用程序.如果在该文件夹中留有不用的或过期的文 ...

  6. 什么是PDM?

    PDM的含义 PDM的中文名称为产品数据管理(Product Data Management). PDM是一门用来管理所有与产品相关信息(包括零件信息.配置.文档.CAD文件.结构.权限信息等)和所有 ...

  7. asyncio标准库2 Hello Clock

    如何调度协程,并发运行 asyncio.gather方法可以聚合协程or future def gather(*coros_or_futures, loop=None, return_exceptio ...

  8. mysql 5.7版本如何修改密码

    这是官方截图,mysql5.7安装后,会有一个默认密码,保存在mysql.log里面,找的他,并更改 官方文档地址 https://dev.mysql.com/doc/refman/5.7/en/li ...

  9. VSCode-python 进阶配置

    VSCode-python 进阶配置 中文乱码 中文乱码,网上一堆解决方法,但是根本没有有效起作用的. 在python脚本的前面添加: # -*- coding:utf-8 -*- 并不能在控制台输出 ...

  10. 一个程序猿试用有道云笔记VIP功能体验

    熟悉我的朋友应该知道,我有一个微信公众号,叫做"汪子熙", 我会定期在上面推送技术文章. 而我绝大多数技术文章都是在每天上下班的地铁上用手机写的,然后到家后同步到电脑上,进行发表. ...