最近一个项目要用到批量的设置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可为空,也可以自己输入,个人理解是区分相同资源的不同版本···有点绕············