自己练手写的一个小工具,目前还十分简陋,日后会不断完善。。
放上代码,需放入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还不算掌握,欢迎、感谢各位佬来指点指点