美文网首页Unity编辑器开发分享
Unity 5.X扩展编辑器之打包assetbundle

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

作者: 小小小小小丶敏 | 来源:发表于2017-09-25 14:18 被阅读27次

    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

    相关文章

      网友评论

        本文标题:Unity 5.X扩展编辑器之打包assetbundle

        本文链接:https://www.haomeiwen.com/subject/ratdextx.html