最近在看 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.存在的问题:

  1. 不支持多平台,只能打当前 PlayerSettings 所设置的平台的 AB 包,有点麻烦。
  2. 需要手动设置 AB 包的名字和扩展名,这个问题完全可以交给代码实现。
  3. 看不到整个工程究竟有哪些设置了AB 包的名字,哪些没设置,有些无关的资源误操作设置了AB 包名,要排查这种资源要花些时间。
  4. 测试的代码中暴露的字符串太多了,其中包括 AB 包名,AB 包路径,要加载的资源名字,这些都可以集中管理或者生成代码。
  5. 欢迎补充

这些问题在此后的文章中一步一步解决,希望大家多给些建议。

欢迎讨论!

转载请注明地址:凉鞋的笔记:liangxiegame.com

更多内容

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

  1. Unity 游戏框架搭建 (四) 简易有限状态机

    为什么用有限状态机?   之前做过一款跑酷游戏,跑酷角色有很多状态:跑.跳.二段跳.死亡等等.一开始是使用if/switch来切换状态,但是每次角色添加一个状态(提前没规划好),所有状态处理相关的代码 ...

  2. Unity 游戏框架搭建 (五) 简易消息机制

    什么是消息机制? 23333333,让我先笑一会. 为什么用消息机制?   三个字,解!!!!耦!!!!合!!!!. 我的框架中的消息机制用例: 1.接收者 ``` using UnityEngine ...

  3. Unity 游戏框架搭建 (二十三) 重构小工具 Platform

    在日常开发中,我们经常遇到或者写出这样的代码 var sTrAngeNamingVariable = "a variable"; #if UNITY_IOS || UNITY_AN ...

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

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

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

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

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

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

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

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

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

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

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

    上篇文章中实现了基本的打包功能,在这篇我们来解决不同平台打AB包的问题. 本篇文章的核心api还是: BuildPipeline.BuildAssetBundles (outPath, 0, Edit ...

随机推荐

  1. 使用mini-define实现前端代码的模块化管理

    这篇文章主要介绍了使用mini-define实现前端代码的模块化管理,十分不错的一篇文章,这里推荐给有需要的小伙伴. mini-define 依据require实现的简易的前端模块化框架.如果你不想花 ...

  2. [转]Oracle ROWNUM用法和分页查询总结

    本文转自:http://blog.csdn.net/fw0124/article/details/42737671 ****************************************** ...

  3. Vue2.0以后,有哪些变化

    最近移动端项目版本升级,Vue由之前的1.0升级到2.3,那么,Vue2.0之后,有哪些细节的变化呢,现在总结如下: 1.在每个组件模板,不再支持片段代码 组件中模板: 之前: <templat ...

  4. java中如何遍历实体类的属性和数据类型以及属性值

      package com.walkerjava.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTa ...

  5. CentOS-7 本地yum源挂载

    在Linux无法连接到互联网时,手动安装依赖是及其麻烦的一件事,需要花费大量的时间寻找rpm包.但在配置本地yum源后,绝决依赖问题就会变得非常简单. 一.准备 centos-7.ISO镜像文件: 二 ...

  6. 序列化json和protobuf大小比较

    使用protobuf序列化为二进制和json序列化字符串大小比较 代码demo package com.gxf.demo; import java.io.*; public class Ptotobu ...

  7. asp and javascript: sql server export data to csv and to xls

    <%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%> <% //塗聚文 //20131021 functio ...

  8. CSS中关于linebox的baseline位置移动的理解

    前言 最近看到一篇文章,弗里得木的翻译笔记,里面有个问题没有解决,就是linebox的baseline为什么会移动呢? 在讨论这个问题之前读者需要对 默认值baseline 以及 其他属性值(天镶的博 ...

  9. 使用angular帮你实现拖拽

    拖拽有多种写法,在这里就看一看angular版的拖拽. <!DOCTYPE html> <html ng-app="myApp"> <head> ...

  10. raw_input与input的区别

    1. 版本差异 raw_input——>python2版本 input——>python3版本 2. 输入格式差异 就是raw_input()随便输都是字符串,而input()必须按照Py ...