Unity 游戏框架搭建 (十二) 简易AssetBundle打包工具(二)
上篇文章中实现了基本的打包功能,在这篇我们来解决不同平台打 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
更多内容
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
Unity 进阶小班:
- 主要训练内容:
- 框架搭建训练(第一年)
- 跟着案例学 Shader(第一年)
- 副业的孵化(第二年、第三年)
- 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
- 主要训练内容:
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

Unity 游戏框架搭建 (十二) 简易AssetBundle打包工具(二)的更多相关文章
- Unity 游戏框架搭建 (十九) 简易对象池
在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化 ...
- Unity 游戏框架搭建 (十) QFramework v0.0.2小结
从框架搭建系列的第一篇文章开始到现在有四个多月时间了,这段时间对自己来说有很多的收获,好多小伙伴和前辈不管是在评论区还是私下里给出的建议非常有参考性,在此先谢过各位. 说到是一篇小节,先列出框架的概要 ...
- Unity 游戏框架搭建 (十六) v0.0.1 架构调整
背景: 前段时间用Xamarin.OSX开发一些工具,遇到了两个问题. QFramework的大部分的类耦合了Unity的API,这样导致不能在其他CLR平台使用QFramework. QFramew ...
- Unity 游戏框架搭建 (十八) 静态扩展 + 泛型实现transform的链式编程
本篇文章介绍如何实现如下代码的链式编程: C# this.Position(Vector3.one) .LocalScale(1.0f) .Rotation(Quaternion.identity); ...
- Unity 游戏框架搭建 (十五) 优雅的QChain (零)
加班加了三个月终于喘了口气,博客很久没有更新了,这段期间框架加了很多Feature,大部分不太稳定,这些Feature中实现起来比较简单而且用的比较稳定的就是链式编程支持了. 什么是链式编程? 我想大 ...
- Unity 游戏框架搭建 (十四) 优雅的QSignleton(零) QuickStart
好久不见 !之前想着让各位直接用QFramework,但是后来想想,如果正在进行的项目直接使用QFramework,这样风险太高了,要改的代码太多,所以打算陆续独立出来一些工具和模块,允许各位一个 ...
- Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...
- Unity 游戏框架搭建 (十三) 无需继承的单例的模板
之前的文章中介绍的Unity 游戏框架搭建 (二) 单例的模板和Unity 游戏框架搭建 (三) MonoBehaviour单例的模板有一些问题. 存在的问题: 只要继承了单例的模板就无法再继承其他的 ...
- Unity 游戏框架搭建 (十七) 静态扩展GameObject实现链式编程
本篇本来是作为原来 优雅的QChain的第一篇的内容,但是QChain流产了,所以收录到了游戏框架搭建系列.本篇介绍如何实现GameObject的链式编程. 链式编程的实现技术之一是C#的静态扩展.静 ...
随机推荐
- e.target和e.event和event.srcElement
e.target 是目标对象,e.event是目标所发生的事件,event.srcElement捕获当前事件作用的对象 1. $(function(){ $("li:has(ul)" ...
- Linux防火墙/iptables使用
iptables是linux下的防火墙组件服务,这两天一直使用,总结一下使用方法: 1.检查iptables是否安装 rpm -qa|grep iptables 如果没有安装该组件,可以通过yum i ...
- div内容溢出
前几天遇到一个问题,代码是这样一个层次: <div class="province"> <ul> <li>1</li> <li ...
- 从零开始的全栈工程师——ajax
AJAX AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = Asynchronous JavaScript and XML. AJAX 是一种用于创建快速动态网页 ...
- sheepdog
- 由AlphaGO引发的思考
这几天AlphaGO的人机大战炒得热火朝天,给谷歌的AI做了一次大大的广告,可谓风头出尽,大有AI战胜一切的“趋势”.而且,像阿法狗.阿法猫之类的新词不断,成了饭前茶后人们议论的热点.作为一个留学过日 ...
- ArcEngine开发鹰眼实现问题
在网上百度一下有关AE鹰眼实现的代码,基本是一样的,可问题是好多代码自己运行起来鹰眼却总是加不进地图.住视图axMapControl1.OnMapReplaced(),axMapControl1.On ...
- 【2015 Week Task】
2015 第17周 task:项目语音识别技术整理 2015 第18周 task:项目key技术整理
- Windows7建立无线热点
很实用的技巧,加以记录. 最初我是想使用connectify的,不过安装这个软件之后,发现有线账号登不上了,所以就选择使用Windows7自带的工具了. 首先以管理员身份运行cmd. 进入之后cd到c ...
- selendroid之toast处理
最近发现原来处理toast的操作失效了.仔细看了下原来的API.决定用switchTo来解决.driver.switchTo().defaultContent().findElement(By.id( ...