[Unity]AssetBundle自动生成、标记的编辑器小工具

自己练手写的一个小工具,目前还十分简陋,日后会不断完善。。

放上代码,需放入Asset下任意位置Editor目录下 

 AssetBundleManagerEditorWindow.cs

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

public class AssetBundleManagerEditorWindow : EditorWindow
{
    public static AssetBundleManagerEditorWindow window;
    /// <summary>
    /// ab包的输出路径
    /// </summary>
    public string outputPath = "/AssetBundle";
    /// <summary>
    /// 所清除ab包标签的路径
    /// </summary>
    public string resetTagPath;
    /// <summary>
    /// 所命名ab包标签的路径
    /// </summary>
    public string setTagPath;
    /// <summary>
    /// 所设置的ab包名称
    /// </summary>
    public string abName;
    /// <summary>
    /// 所设置的ab包扩展名
    /// </summary>
    public string abVariant;

    [MenuItem("Tools/AssetBundle")]
    public static void AssetBundleManager()
    {
        window = GetWindowWithRect<AssetBundleManagerEditorWindow>(new Rect(0, 0, 700, 90), false, "AssetBundleManager", true);
        window.Show();
    }
    public void OnGUI()
    {
        #region 自动打包所有资产并输出到指定路径
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("输出AB包路径", GUILayout.Width(80));
        outputPath = EditorGUILayout.TextField(outputPath);
        if (GUILayout.Button("开始打包", GUILayout.Width(100)))
        {
            if (outputPath == null || outputPath == "")
            {
                Debug.LogError("请输入输出路径!");
                return;
            }
            string savePath = Application.dataPath.Substring(0, Application.dataPath.LastIndexOf('/')) + '/' + outputPath;
            DirectoryInfo directoryInfo = new DirectoryInfo(savePath);
            if (directoryInfo.Exists == false)
            {
                directoryInfo.Create();
            }
            BuildPipeline.BuildAssetBundles(savePath, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows);
            AssetDatabase.Refresh();
        }
        EditorGUILayout.EndHorizontal();
        #endregion

        #region 对文件夹下所有资产进行统一标记/自动标记
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("对该路径下所有AB包命名", GUILayout.Width(140));
        setTagPath = EditorGUILayout.TextField(setTagPath);
        if (GUILayout.Button("自动命名", GUILayout.Width(100)))
        {
            DirectoryInfo directoryInfo = CheckPath(setTagPath);
            if(directoryInfo != null)
            {
                SetAssetBundleTagAuto(directoryInfo);
            }
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("AssetBundleName", GUILayout.Width(105));
        abName = EditorGUILayout.TextField(abName);
        EditorGUILayout.LabelField("AssetBundleVarient", GUILayout.Width(111));
        abVariant = EditorGUILayout.TextField(abVariant);
        if (GUILayout.Button("指定命名", GUILayout.Width(100)))
        {
            DirectoryInfo directoryInfo = CheckPath(setTagPath);
            if (directoryInfo != null && abName != null)
            {
                SetAssetBundleTag(directoryInfo);
            }
        }
        EditorGUILayout.EndHorizontal();
        #endregion

        #region 清空文件夹下所有的标签
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("清空该路径下所有已命名AB包", GUILayout.Width(165));
        resetTagPath = EditorGUILayout.TextField(resetTagPath);
        if (GUILayout.Button("清空命名",GUILayout.Width(100)))
        {
            DirectoryInfo directoryInfo = CheckPath(resetTagPath);
            if(directoryInfo != null)
            {
                ResetAssetBundleTag(directoryInfo);
            }
        }
        EditorGUILayout.EndHorizontal();
        #endregion
    }
    public DirectoryInfo CheckPath(string path)
    {
        if (path == null || path == "")
        {
            Debug.LogError("请输入路径!");
            return null;
        }
        DirectoryInfo directoryInfo = new DirectoryInfo(path);
        if (path == null)
        {
            Debug.LogError("该路径下文件为空!");
            return null;
        }
        return directoryInfo;
    }
    /// <summary>
    /// 按所选目录名路径所有资源下自动标记
    /// </summary>
    /// <param name="directoryInfo"></param>
    /// <param name="autoABName"></param>
    public void SetAssetBundleTagAuto(DirectoryInfo directoryInfo, string autoABName = null)
    {
        if(autoABName == null)
        {
            autoABName = directoryInfo.Name;
        }
        FileSystemInfo[] files = directoryInfo.GetFileSystemInfos();
        foreach (FileSystemInfo file in files)
        {
            if (file is DirectoryInfo)
            {
                //如果是文件夹则继续递归搜索
                SetAssetBundleTagAuto(file as DirectoryInfo, autoABName);
                continue;
            }
            if (file.Extension == ".meta" || file.Extension == ".txt")
            {
                //非游戏资产不处理
                continue;
            }
            //否则则进行清除
            string filePath = file.FullName.Replace('\\', '/');
            filePath = filePath.Replace(Application.dataPath, "Assets");
            AssetImporter ai = AssetImporter.GetAtPath(filePath);
            ai.assetBundleName = autoABName;
            ai.assetBundleVariant = file.Extension == ".unity" ? "u3d" : "ab";
            AssetDatabase.RemoveUnusedAssetBundleNames();
            Debug.Log(file.Name + "资源已标记为:" + ai.assetBundleName + "." + ai.assetBundleVariant);
        }
    }
    /// <summary>
    /// 根据输入的包名进行标记
    /// </summary>
    /// <param name="directoryInfo"></param>
    public void SetAssetBundleTag(DirectoryInfo directoryInfo)
    {
        if (abName == null)
        {
            Debug.LogError("请输入ab包名称!");
            return;
        }
        FileSystemInfo[] files = directoryInfo.GetFileSystemInfos();
        foreach (FileSystemInfo file in files)
        {
            if (file is DirectoryInfo)
            {
                //如果是文件夹则继续递归搜索
                SetAssetBundleTag(file as DirectoryInfo);
                continue;
            }
            if (file.Extension == ".meta" || file.Extension == ".txt")
            {
                //非游戏资产不处理
                continue;
            }
            //否则则进行清除
            string filePath = file.FullName.Replace('\\', '/');
            filePath = filePath.Replace(Application.dataPath, "Assets");
            AssetImporter ai = AssetImporter.GetAtPath(filePath);
            ai.assetBundleName = abName;
            if(abVariant != null || abVariant != "")
            {
                ai.assetBundleVariant = abVariant;//赋空值会报错(以及全为空格的字符串)
            }
            AssetDatabase.RemoveUnusedAssetBundleNames();
            Debug.Log(file.Name + "资源已标记为:" + ai.assetBundleName + "." + ai.assetBundleVariant);
        }
    }
    /// <summary>
    /// 清空路径下所有AB包标签
    /// </summary>
    /// <param name="directoryInfo"></param>
    public void ResetAssetBundleTag(DirectoryInfo directoryInfo)
    {
        FileSystemInfo[] files = directoryInfo.GetFileSystemInfos();
        foreach (FileSystemInfo file in files)
        {
            if (file is DirectoryInfo)
            {
                //如果是文件夹则继续递归搜索
                ResetAssetBundleTag(file as DirectoryInfo);
                continue;
            }
            if (file.Extension == ".meta" || file.Extension == ".txt")
            {
                //非游戏资产不处理
                continue;
            }
            //否则则进行清除
            string filePath = file.FullName.Replace('\\', '/');
            filePath = filePath.Replace(Application.dataPath, "Assets");
            AssetImporter ai = AssetImporter.GetAtPath(filePath);
            ai.assetBundleName = null;
            AssetDatabase.RemoveUnusedAssetBundleNames();
            Debug.Log("已清除" + directoryInfo.Name + "的标记");
        }
    }
}

对AB还不算掌握,欢迎、感谢各位佬来指点指点

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值