凉鞋的笔记

努力 坚持,越幸运

嗨,我是凉鞋,我的乐趣是节省大家的时间。


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

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

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

附:我的框架地址
转载请注明地址:凉鞋的笔记
微信公众号:QWERTeam

最近的文章

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

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

Unity框架搭建继续阅读
更早的文章

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

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

Unity框架搭建继续阅读
comments powered by Disqus