Unity 5.X扩展编辑器之打包assetbundle

5.x的assetbundle与4.x以及之前的版本有些不同,不过本质是一样的,只不过5.x打包assetbundle更为简单和人性化了,总体来说只需要三个步骤:

//这里是一个资源包数组,其中每一个资源包又可以包含多个小资源,所以一般情况下一个资源包就足够了  
AssetBundleBuild[] _ABbuild = new AssetBundleBuild[1];  

第二步:给资源命名以及指定需要打包的资源

//资源包的名称  
_ABbuild[0].assetBundleName = "打包assetbundle出来之后的文件名";  
//资源包下的资源名称,一个资源包可以包含多个资源,资源由从Assets开始的路径组成且包含自身后缀名  
string[] _allassetname = new string[3];  
_allassetname[0] = "Assets/1.png";  
_allassetname[1] = "Assets/2.prefab";  
_allassetname[2] = "Assets/3.FBX";  
_ABbuild[0].assetNames = _allassetname;  

第三步:开始打包

//打包到路径E:/test/mytest  
BuildPipeline.BuildAssetBundles("E:/test/mytest", _ABbuild);  

将之封装成扩展编辑器之后,把如下脚本放在Editor文件夹内:

using UnityEngine;  
using UnityEditor;  
using System.Diagnostics;  
using System.IO;  
  
public class ExportAssetBundles : EditorWindow  
{  
  
    [@MenuItem("AssetBundles/Build AssetBundles")]  
    static void main()  
    {  
        EditorWindow.GetWindow<ExportAssetBundles>(false,"AssetBundles");  
    }  
      
    private Vector2 scrollVec2;  
    private string rootPath = "Assets";  
    private string _assetBundleName = "";  
    private string _assetBundlePath = "Assets/StreamingAssets";  
    private int _assetBundleElementNum = 4;  
    private string[] _assetBundleElement = new string[4];  
      
    void OnGUI()  
    {  
        scrollVec2 = EditorGUILayout.BeginScrollView(scrollVec2, GUILayout.Width(position.width), GUILayout.Height(position.height));  
  
        EditorGUILayout.BeginHorizontal();  
        GUILayout.Label("资源包名称:");  
        _assetBundleName = EditorGUILayout.TextField(_assetBundleName);  
        if (GUILayout.Button("清空"))  
            EditorApplication.delayCall += Delete;  
        EditorGUILayout.EndHorizontal();  
  
        EditorGUILayout.BeginHorizontal();  
        GUILayout.Label("资源包路径:");  
        _assetBundlePath = EditorGUILayout.TextField(_assetBundlePath);  
        if (GUILayout.Button("浏览"))  
            EditorApplication.delayCall += Save;  
        EditorGUILayout.EndHorizontal();  
  
        EditorGUILayout.BeginHorizontal();  
        GUILayout.Label("资源包容量:");  
        _assetBundleElementNum = EditorGUILayout.IntField(_assetBundleElementNum);  
        if (GUILayout.Button("增加"))  
            EditorApplication.delayCall += Add;  
        EditorGUILayout.EndHorizontal();  
  
        if (_assetBundleElementNum > 0)  
        {  
            if (_assetBundleElement.Length != _assetBundleElementNum)  
            {  
                string[] temp = _assetBundleElement;  
                _assetBundleElement = new string[_assetBundleElementNum];  
                for (int i = 0; i < temp.Length; i++)  
                {  
                    if (i < _assetBundleElement.Length)  
                        _assetBundleElement[i] = temp[i];  
                }  
            }  
            for (int i = 0; i < _assetBundleElementNum; i++)  
            {  
                EditorGUILayout.BeginHorizontal();  
                GUILayout.Label("资源" + (i + 1) + ":");  
                _assetBundleElement[i] = EditorGUILayout.TextField(_assetBundleElement[i]);  
                if (GUILayout.Button("浏览"))  
                    Browse(i);  
                EditorGUILayout.EndHorizontal();  
            }  
        }  
        if (GUILayout.Button("打包"))  
        {  
            if (_assetBundleName == "")  
            {  
                //打开一个通知栏  
                this.ShowNotification(new GUIContent("资源包名称不可为空"));  
                return;  
            }  
            if (_assetBundlePath == "C:/" || _assetBundlePath == "D:/" || _assetBundlePath == "E:/" || _assetBundlePath == "F:/")  
            {  
                //打开一个通知栏  
                this.ShowNotification(new GUIContent("资源包路径不可为根目录"));  
                return;  
            }  
            if (_assetBundleElementNum <= 0)  
            {  
                //打开一个通知栏  
                this.ShowNotification(new GUIContent("资源包容量必须大于0"));  
                return;  
            }  
            for (int i = 0; i < _assetBundleElement.Length; i++)  
            {  
                if (_assetBundleElement[i] == null || _assetBundleElement[i] == "")  
                {  
                    //打开一个通知栏  
                    this.ShowNotification(new GUIContent("资源"+(i+1)+"路径为空"));  
                    return;  
                }  
            }  
            EditorApplication.delayCall += Build;  
        }  
  
        EditorGUILayout.EndScrollView();  
    }  
    /// <summary>  
    /// 清空资源包名称  
    /// </summary>  
    void Delete()  
    {  
        _assetBundleName = "";  
        //转移焦点至主窗口  
        EditorUtility.FocusProjectWindow();  
    }  
    /// <summary>  
    /// 选择资源存储路径  
    /// </summary>  
    void Save()  
    {  
        string path = EditorUtility.OpenFolderPanel("选择要存储的路径", "", "");  
        if (path.Length != 0)  
        {  
            _assetBundlePath = path;  
            EditorUtility.FocusProjectWindow();  
        }  
    }  
    /// <summary>  
    /// 资源包容量增加  
    /// </summary>  
    void Add()  
    {  
        _assetBundleElementNum += 1;  
        EditorUtility.FocusProjectWindow();  
    }  
    /// <summary>  
    /// 选择单个打包资源  
    /// </summary>  
    /// <param name="i">资源序号</param>  
    void Browse(int i)  
    {  
        string path = EditorUtility.OpenFilePanel("选择要打包的资源", @"E:\hutao\Unity Project5.2\Course Cloud Platform\Assets", "*");  
        if (path.Length != 0)  
        {  
            if (path.IndexOf(rootPath) >= 0)  
            {  
                //如果选中的资源是dll文件,则自动改后缀名为.bytes  
                if (path.EndsWith(".dll"))  
                {  
                    string newpath = path.Substring(0, path.LastIndexOf('.')) + ".bytes";  
                    File.Move(path, newpath);  
                    _assetBundleElement[i] = newpath.Substring(newpath.IndexOf(rootPath));  
                    AssetDatabase.Refresh();  
                }  
                else  
                {  
                    _assetBundleElement[i] = path.Substring(path.IndexOf(rootPath));  
                }  
            }  
        }  
    }  
    /// <summary>  
    /// 打包资源  
    /// </summary>  
    void Build()  
    {  
        //需要打包的资源(可打包成多个)  
        AssetBundleBuild[] buildMap = new AssetBundleBuild[1];  
  
        //资源包的名称  
        buildMap[0].assetBundleName = _assetBundleName;  
        //资源包下的资源名称,一个资源包可以包含多个资源,资源由从Assets开始的路径组成且包含自身后缀名  
        buildMap[0].assetNames = _assetBundleElement;  
  
        BuildPipeline.BuildAssetBundles(_assetBundlePath, buildMap);  
    }  
}  

在编辑器中效果图如下:(其中每个资源小项可以是工程中的文件夹,如果是文件夹的话那么该文件夹内所有资源都会打包进去)

文章转自:http://blog.csdn.net/qq992817263/article/details/50730467

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容