最近一個項目要用到批量的設置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可爲空,也可以自己輸入,個人理解是區分相同資源的不同版本···有點繞············