zoukankan      html  css  js  c++  java
  • Unity 游戏框架搭建 2017 (十一) 简易 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. 欢迎补充

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

    欢迎讨论!

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

    更多内容

  • 相关阅读:
    TCL环境检查
    POI之Excel文档增删改查
    wireshark自动化之tshark命令行
    selenium-webdriver
    ruby自动化之selenium webGUI
    TCL自动化之SSH交互式
    链表的操作
    参考网址
    RTC定时开机闹钟
    中断
  • 原文地址:https://www.cnblogs.com/liangxiegame/p/Unity-you-xi-kuang-jia-da-jian-shi-yi-jian-yiAsset.html
Copyright © 2011-2022 走看看