zoukankan      html  css  js  c++  java
  • 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:hutaoUnity Project5.2Course Cloud PlatformAssets", "*");
            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);
        }
    }



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




  • 相关阅读:
    深入了解JVM-方法区
    Mysql性能调优
    基督教 犹太  新教  东正教 天主教
    caffe的matlab接口一览表
    ubuntu下 编译Caffe的Matlab接口
    Linux入门学习教程:虚拟机体验之KVM篇
    利用proxychains在终端使用socks5代理
    process lasso 优化原理
    解决win7和ubuntu双系统ubuntu不能上网的问题
    调试minix内核
  • 原文地址:https://www.cnblogs.com/liang123/p/6325897.html
Copyright © 2011-2022 走看看