【Unity3D】自制小工具批量设置AB包名

         最近一个项目要用到批量的设置AB包名,由于同一类的资源在一个文件夹内,所以就查着资料写了一个小工具,以文件夹为单位批量修改内部的资源包名,方便打包,话不多说直接上代码吧:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class SetAssetBundleName : EditorWindow
{
    //******系统设置
    //一种系统样式,使用他可以使控件周围表现为一个BOX的模样
    private GUIStyle _box = new GUIStyle("Box");

    //******窗口参数
    private Vector2 _FilesScrollValue;//当前文件滚动的位置

    //******资源参数
    static List<stru_FileInfo> list_Files;//文件列表

    string assetBundleName;
    string assetBundleVariant = "";
    //int indentation;//缩进等级
    struct stru_FileInfo
    {
        public string fileName;
        public string filePath;//绝对路径
        public string assetPath;//U3D内部路径
        public Type assetType;
    }
    
    [MenuItem("Assets/AssetBundle工具箱/设置AB包名")]
    private static void OpenSetAssetBundleNameWindow()
    {
        list_Files = new List<stru_FileInfo>();
        //indentation = 1;
        CheckFileSystemInfo();
        SetAssetBundleName ABNameWin = GetWindow<SetAssetBundleName>("设置AssetBundlesName");
        ABNameWin.position = new Rect(300, 100, 300,500);
        ABNameWin.minSize = new Vector2(300, 500);
        ABNameWin.Show();
    }
    private void OnGUI()
    {
        //设置GUI label参数
        GUI.skin.label.fontSize = 10;
        GUI.skin.label.alignment = TextAnchor.MiddleLeft;
        FilesGUI();
        SetABNameGUI();
    }
    void FilesGUI()
    {
        //标题
        GUILayout.Space(5);
        EditorGUILayout.BeginHorizontal();
        GUILayout.Space(150);
        if (GUILayout.Button("刷新资源", _box))
        {
            list_Files.Clear();
            CheckFileSystemInfo();
        }
        EditorGUILayout.EndHorizontal();

        GUI.Label(new Rect(5, 35, 100, 20), "选中" + list_Files.Count + "项资源:");
        GUILayout.Space(10);

        _FilesScrollValue = EditorGUILayout.BeginScrollView(_FilesScrollValue, _box, GUILayout.MaxHeight(300));
        AddFileGUIToScroll();
        EditorGUILayout.EndScrollView();

        //GUI.EndGroup();
    }
    /// <summary>
    /// 绘制选中的文件资源到滑块
    /// </summary>
    void AddFileGUIToScroll()
    {
        foreach (stru_FileInfo file in list_Files)
        {
            // 开启一行
            GUILayout.BeginVertical();
            //获取系统中的文件夹图标
            GUIContent content = EditorGUIUtility.ObjectContent(null, file.assetType);
            content.text = file.fileName;
            //以lable展示
            GUILayout.Label(content, GUILayout.Height(20));
            
            GUILayout.EndVertical();
        }
    }
    void SetABNameGUI()
    {
        EditorGUILayout.BeginVertical();
        //设置包名
        GUILayout.Space(20);
        EditorGUILayout.BeginHorizontal();
        assetBundleName = EditorGUILayout.TextField("要设置的包名:", assetBundleName);
        EditorGUILayout.EndHorizontal();
        //设置AB版本
        EditorGUILayout.BeginHorizontal();
        assetBundleVariant = EditorGUILayout.TextField("资源拓展名:", assetBundleVariant);
        EditorGUILayout.EndHorizontal();

        //确定设置
        GUILayout.Space(20);
        if (GUILayout.Button("确定"))
        {
            for(int a =0;a < list_Files.Count; a++)
            {
                SetBundleName(list_Files[a].assetPath);
            }
        }
        EditorGUILayout.EndVertical();

        //GUI.EndGroup();
    }
    #region 设置选中文件夹下的所有对象的assetBundle的名字
    /// <summary>
    /// 检查文件系统下的信息
    /// </summary>
    private static void CheckFileSystemInfo()
    {
        AssetDatabase.RemoveUnusedAssetBundleNames();//移除无用的AssetBundleName

        UnityEngine.Object obj = Selection.activeObject;    //选中的物体
        string path = AssetDatabase.GetAssetPath(obj);//选中的文件夹

        CoutineCheck(path);
    }
    /// <summary>
    /// 是文件,继续向下
    /// </summary>
    /// <param name="path"></param>
    private static void CoutineCheck(string path)
    {
        DirectoryInfo directory = new DirectoryInfo(path);
        FileSystemInfo[] fileSystemInfos = directory.GetFileSystemInfos();

        foreach (var item in fileSystemInfos)
        {
            // Debug.Log(item);
            int idx = item.ToString().LastIndexOf(@"\");
            string name = item.ToString().Substring(idx + 1);

            if (!name.Contains(".meta"))
            {
                CheckFileOrDirectory(item, path + "/" + name);  //item  文件系统,加相对路径
            }
        }

    }
    /// <summary>
    /// 判断是文件还是文件夹,是文件的话加入列表
    /// </summary>
    /// <param name="fileSystemInfo"></param>
    /// <param name="path"></param>
    private static void CheckFileOrDirectory(FileSystemInfo fileSystemInfo, string path)
    {
        FileInfo fileInfo = fileSystemInfo as FileInfo;
        if (fileInfo != null)
        {
            //Debug.Log(fileInfo.Name);//文件名
            //Debug.LogWarning(fileInfo.FullName);//路径带文件名
            //Debug.LogError(fileInfo.DirectoryName);//上级路径
            stru_FileInfo t_file = new stru_FileInfo();
            t_file.fileName = fileInfo.Name;
            t_file.filePath = fileInfo.FullName;
            t_file.assetPath = "Assets" + fileInfo.FullName.Replace(Application.dataPath.Replace("/", "\\"), "");//用于下一步获得文件类型
            t_file.assetType = AssetDatabase.GetMainAssetTypeAtPath(t_file.assetPath);
            t_file.assetPath = path;
            list_Files.Add(t_file);
        }
        else
        {
            CoutineCheck(path);
        }
    }
    /// <summary>
    /// 设置assetbundle名字
    /// </summary>
    /// <param name="path"></param>
    private void SetBundleName(string path)
    {
        var importer = AssetImporter.GetAtPath(path);
        string[] strs = path.Split('.');
        string[] dictors = strs[0].Split('/');
        if (importer != null)
        {
            if (assetBundleVariant != "")
            {
                importer.assetBundleVariant = assetBundleVariant;
            }
            if(assetBundleName != "")
            {
                importer.assetBundleName = dictors[dictors.Length - 2] + "/" + assetBundleName;
            }
        }
        else
            Debug.Log("importer是空的");
    }

    #endregion
}

使用方法即使选中要修改 的文件夹右键,或者在工具栏里点击Assets --->AssetBundle工具箱---> 设置AB包名,即可!

注意包号assetBundleVariant可为空,也可以自己输入,个人理解是区分相同资源的不同版本···有点绕············

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章