Unity 游戏框架搭建 (十一) 简易AssetBundle打包工具(一)
最近在看 Unity 官方的 AssetBundle(以下简称 AB )的教程,也照着做了一遍,不过做出来的 AssetBundleManager 的 API 设计得有些不太习惯。目前想到了一个可行的解决方案。AB 相关的内容有点多,所以为了良好的阅读体验,就把教程分为几个小文章,一次写一个点。
1. AssetBundle设置:
首先要确定一个专门打资源包用的目录,我的框架定的目录是 QArt/QAB,并存放了一些 Prefab 资源,如下所示。

然后选定 TestAB 目录,将 Inspector 窗口的设置为如下图所示:

一级名字为 testab,二级扩展名为 unity3d。 这样 AB 就设置好了。
2. 制作编辑器工具。
这里打包的核心 API 只有一个,就是
BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget);
贴上编辑器工具代码:
using UnityEditor;
using System.Collections;
using UnityEngine;
using System.IO;
using System.Collections.Generic;
namespace QFramework.Editor {
public class QABEditor
{
[MenuItem("QFramework/AB/Build")]
public static void BuildAssetBundle()
{
// AB包输出路径
string outPath = Application.streamingAssetsPath + "/QAB";
// 检查路径是否存在
CheckDirAndCreate (outPath);
BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget);
// 刚创建的文件夹和目录能马上再Project视窗中出现
AssetDatabase.Refresh ();
}
/// <summary>
/// 判断路径是否存在,不存在则创建
/// </summary>
public static void CheckDirAndCreate(string dirPath)
{
if (!Directory.Exists (dirPath)) {
Directory.CreateDirectory (dirPath);
}
}
}
}
这个脚本要放在 Editor 目录下!!!
这个脚本要放在 Editor 目录下!!!
这个脚本要放在 Editor 目录下!!!
使用方法:
点击QFramework/AB/Build

之后,生成的AB包如下所示:

AB包就打好了,接下来开始测试AB包的使用。
3.测试:
代码很简单,如下所示,一些常识性的问题就不介绍了。
using UnityEngine;
using System.Collections;
using System.IO;
namespace QFramework.Example {
public class TestABEditor : MonoBehaviour {
// Use this for initialization
IEnumerator Start () {
WWW www = new WWW ("file:///" + Application.streamingAssetsPath + Path.DirectorySeparatorChar + "QAssetBundle" + Path.DirectorySeparatorChar + "testab.unity3d");
yield return www;
if (string.IsNullOrEmpty (www.error)) {
var go = www.assetBundle.LoadAsset<GameObject> ("Canvas");
Instantiate (go);
}
else {
Debug.LogError (www.error);
}
}
// Update is called once per frame
void Update () {
}
}
}
运行结果:

最初版的打包工具就做好了,接下来到了吐槽的时刻了。
4.存在的问题:
- 不支持多平台,只能打当前 PlayerSettings 所设置的平台的 AB 包,有点麻烦。
- 需要手动设置 AB 包的名字和扩展名,这个问题完全可以交给代码实现。
- 看不到整个工程究竟有哪些设置了AB 包的名字,哪些没设置,有些无关的资源误操作设置了AB 包名,要排查这种资源要花些时间。
- 测试的代码中暴露的字符串太多了,其中包括 AB 包名,AB 包路径,要加载的资源名字,这些都可以集中管理或者生成代码。
- 欢迎补充
这些问题在此后的文章中一步一步解决,希望大家多给些建议。
欢迎讨论!
转载请注明地址:凉鞋的笔记:liangxiegame.com
更多内容
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
Unity 进阶小班:
- 主要训练内容:
- 框架搭建训练(第一年)
- 跟着案例学 Shader(第一年)
- 副业的孵化(第二年、第三年)
- 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
- 主要训练内容:
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

Unity 游戏框架搭建 (十一) 简易AssetBundle打包工具(一)的更多相关文章
- Unity 游戏框架搭建 (四) 简易有限状态机
为什么用有限状态机? 之前做过一款跑酷游戏,跑酷角色有很多状态:跑.跳.二段跳.死亡等等.一开始是使用if/switch来切换状态,但是每次角色添加一个状态(提前没规划好),所有状态处理相关的代码 ...
- Unity 游戏框架搭建 (五) 简易消息机制
什么是消息机制? 23333333,让我先笑一会. 为什么用消息机制? 三个字,解!!!!耦!!!!合!!!!. 我的框架中的消息机制用例: 1.接收者 ``` using UnityEngine ...
- Unity 游戏框架搭建 (二十三) 重构小工具 Platform
在日常开发中,我们经常遇到或者写出这样的代码 var sTrAngeNamingVariable = "a variable"; #if UNITY_IOS || UNITY_AN ...
- Unity 游戏框架搭建 (十) QFramework v0.0.2小结
从框架搭建系列的第一篇文章开始到现在有四个多月时间了,这段时间对自己来说有很多的收获,好多小伙伴和前辈不管是在评论区还是私下里给出的建议非常有参考性,在此先谢过各位. 说到是一篇小节,先列出框架的概要 ...
- Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...
- Unity 游戏框架搭建 (十六) v0.0.1 架构调整
背景: 前段时间用Xamarin.OSX开发一些工具,遇到了两个问题. QFramework的大部分的类耦合了Unity的API,这样导致不能在其他CLR平台使用QFramework. QFramew ...
- Unity 游戏框架搭建 (十三) 无需继承的单例的模板
之前的文章中介绍的Unity 游戏框架搭建 (二) 单例的模板和Unity 游戏框架搭建 (三) MonoBehaviour单例的模板有一些问题. 存在的问题: 只要继承了单例的模板就无法再继承其他的 ...
- Unity 游戏框架搭建 (十七) 静态扩展GameObject实现链式编程
本篇本来是作为原来 优雅的QChain的第一篇的内容,但是QChain流产了,所以收录到了游戏框架搭建系列.本篇介绍如何实现GameObject的链式编程. 链式编程的实现技术之一是C#的静态扩展.静 ...
- Unity 游戏框架搭建 (十二) 简易AssetBundle打包工具(二)
上篇文章中实现了基本的打包功能,在这篇我们来解决不同平台打AB包的问题. 本篇文章的核心api还是: BuildPipeline.BuildAssetBundles (outPath, 0, Edit ...
随机推荐
- 删除table表格行
function getRowObj(obj) { while(obj.tagName.toLowerCase()!="tr") // toLowerCase转化小写 { ...
- 6、Modal
1.首先Modal是一个内容窗格.通常用来做一个选择或编辑. 先来看一下 tabs.html 做了什么. /* --- tabs.html ----*/ <ion-navbar *navbar ...
- .net生成cookie,读取cookie,创建特性
1.登录或注册成功时生成票据和cookie 注释:__JZY_Common_User_Login_Cookie__:就是为了判断当前登录人(例如:管理员和普通用户,可以定义两个常量,可有可无) 2.读 ...
- C# 读写xml、excel、word、ppt、access
C# 读写xml.excel.word.access 这里只是起个头,不做深入展开,方便以后用到参考 读写xml,主要使用.net 的xml下的document using System;using ...
- vim-plug
vim包管理器vim-plug 安装 curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent. ...
- stark——查看页面编辑删除按钮
一.数据列表 设计查页面,主要展示两部分内容,表头部分和数据部分, 表头通过遍历list_display和默认要显示的编辑和删除字段. 1.数据构建 (1)service/stark.py,后台数据构 ...
- css border-radius的用法及自适应的椭圆
我们知道border-radius允许您为元素添加圆角边框! 而border-radius 属性是一个简写属性,用于设置四个 border-*-radius 属性. 如果省略 bottom-left, ...
- keras 保存模型
转自:https://blog.csdn.net/u010159842/article/details/54407745,感谢分享! 我们不推荐使用pickle或cPickle来保存Keras模型 你 ...
- PHP 数字转汉字函数
/** * 数字转汉字描述 */ function numToStr($num) { // 判断正确数字 if (!preg_match('/^(\d*)(\.\d+)?$/', $num)) ret ...
- 媒体查询,screen and 和only screen and有什么不同
最佳答案: 彩屏设备 和 (最小宽度768px) 和 (最大宽度959px) 仅限 彩屏设备 和 (最小宽度480px) 和 (最大宽度767px) 在你发的代码中其实没有什么不同,用起来效果都是一样 ...